├── src ├── Models │ └── AutoNumber.php ├── AutoNumberTrait.php ├── AutoNumberServiceProvider.php ├── Observers │ └── AutoNumberObserver.php └── AutoNumber.php ├── config └── autonumber.php ├── migrations └── 2017_08_03_055212_create_auto_numbers.php ├── composer.json └── README.md /src/Models/AutoNumber.php: -------------------------------------------------------------------------------- 1 | '?', 10 | 11 | /* 12 | * The number of digits in the autonumber 13 | */ 14 | 'length' => 4, 15 | 16 | /* 17 | * Whether to update the autonumber value when a model is being updated. 18 | * Defaults to false, which means autonumber are not updated. 19 | */ 20 | 'onUpdate' => false, 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /src/AutoNumberTrait.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name', 32); 19 | $table->integer('number'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('auto_numbers'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/AutoNumberServiceProvider.php: -------------------------------------------------------------------------------- 1 | publishes([ 18 | __DIR__.'/../migrations/' => database_path('migrations'), 19 | ], 'migrations'); 20 | 21 | $this->publishes([ 22 | __DIR__.'/../config/autonumber.php' => config_path('autonumber.php'), 23 | ], 'config'); 24 | } 25 | 26 | /** 27 | * Register the application services. 28 | * 29 | * @return void 30 | */ 31 | public function register() 32 | { 33 | $this->app->singleton(AutoNumberObserver::class, function ($app) { 34 | return new AutoNumberObserver(new AutoNumber()); 35 | }); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "alfa6661/laravel-autonumber", 3 | "description": "Laravel package to create autonumber for Eloquent model", 4 | "keywords": [ 5 | "laravel", 6 | "eloquent", 7 | "autonumber" 8 | ], 9 | "homepage": "https://github.com/alfa6661/laravel-autonumber", 10 | "license": "MIT", 11 | "authors": [ 12 | { 13 | "name": "Alfa Adhitya", 14 | "email": "alfa2159@gmail.com" 15 | } 16 | ], 17 | "require": { 18 | "illuminate/config": "^5.1|^6.0|^7.0|^8.0|^9.0", 19 | "illuminate/database": "^5.1|^6.0|^7.0|^8.0|^9.0", 20 | "illuminate/support": "^5.1|^6.0|^7.0|^8.0|^9.0" 21 | }, 22 | "autoload": { 23 | "psr-4": { 24 | "Alfa6661\\AutoNumber\\": "src" 25 | } 26 | }, 27 | "minimum-stability": "dev", 28 | "prefer-stable": true, 29 | "extra": { 30 | "laravel": { 31 | "providers": [ 32 | "Alfa6661\\AutoNumber\\AutoNumberServiceProvider" 33 | ] 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Observers/AutoNumberObserver.php: -------------------------------------------------------------------------------- 1 | autoNumber = $autoNumber; 23 | } 24 | 25 | /** 26 | * @param \Illuminate\Database\Eloquent\Model $model 27 | * @return null 28 | */ 29 | public function saving(Model $model) 30 | { 31 | if (! config('autonumber.onUpdate', false) && $model->exists) { 32 | return; 33 | } 34 | 35 | $this->generateAutoNumber($model); 36 | } 37 | 38 | /** 39 | * Generate auto number. 40 | * 41 | * @param Model $model 42 | * @return bool 43 | */ 44 | protected function generateAutoNumber(Model $model) 45 | { 46 | $generated = $this->autoNumber->generate($model); 47 | 48 | return $generated; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Laravel AutoNumber 2 | 3 | [![Latest Stable Version](https://poser.pugx.org/alfa6661/laravel-autonumber/v/stable)](https://packagist.org/packages/alfa6661/laravel-autonumber) 4 | [![Total Downloads](https://poser.pugx.org/alfa6661/laravel-autonumber/downloads)](https://packagist.org/packages/alfa6661/laravel-autonumber) 5 | [![StyleCI](https://styleci.io/repos/99206904/shield)](https://styleci.io/repos/99206904) 6 | [![License](https://poser.pugx.org/alfa6661/laravel-autonumber/license)](https://packagist.org/packages/alfa6661/laravel-autonumber) 7 | 8 | 9 | Laravel package to create autonumber for Eloquent model 10 | 11 | # Installation 12 | 13 | You can install the package via composer: 14 | 15 | ``` 16 | composer require alfa6661/laravel-autonumber 17 | ``` 18 | 19 | Register the ServiceProvider in `config/app.php` 20 | 21 | ```php 22 | 'providers' => [ 23 | // ... 24 | Alfa6661\AutoNumber\AutoNumberServiceProvider::class, 25 | ], 26 | ``` 27 | 28 | Publish the default configuration 29 | 30 | ``` 31 | php artisan vendor:publish --provider='Alfa6661\AutoNumber\AutoNumberServiceProvider' 32 | ``` 33 | 34 | Running migration 35 | 36 | ``` 37 | php artisan migrate 38 | ``` 39 | 40 | # Usage 41 | 42 | Your Eloquent models should use the `Alfa6661\AutoNumber\AutoNumberTrait` trait 43 | 44 | The trait contains an abstract method `getAutoNumberOptions()` that you must implement yourself. 45 | 46 | 47 | ```php 48 | use Alfa6661\AutoNumber\AutoNumberTrait; 49 | 50 | class Order extends Model 51 | { 52 | use AutoNumberTrait; 53 | 54 | /** 55 | * Return the autonumber configuration array for this model. 56 | * 57 | * @return array 58 | */ 59 | public function getAutoNumberOptions() 60 | { 61 | return [ 62 | 'order_number' => [ 63 | 'format' => 'SO.?', // autonumber format. '?' will be replaced with the generated number. 64 | 'length' => 5 // The number of digits in an autonumber 65 | ] 66 | ]; 67 | } 68 | 69 | } 70 | ``` 71 | 72 | You can also pass a `closure` for the format value. 73 | 74 | ```php 75 | public function getAutoNumberOptions() 76 | { 77 | return [ 78 | 'order_number' => [ 79 | 'format' => function () { 80 | return 'SO/' . date('Ymd') . '/?'; // autonumber format. '?' will be replaced with the generated number. 81 | }, 82 | 'length' => 5 // The number of digits in the autonumber 83 | ] 84 | ]; 85 | } 86 | ``` 87 | 88 | ## Saving Model 89 | 90 | ```php 91 | $order = Order::create([ 92 | 'customer' => 'Mr. X', 93 | ]); 94 | ``` 95 | 96 | The order_number will be automatically generated based on the format given when saving the Order model. 97 | 98 | ```php 99 | echo $order->order_number; 100 | 101 | // SO/20170803/00001 102 | ``` 103 | 104 | ## License 105 | 106 | Laravel-autonumber is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT). 107 | 108 | ## Contributing 109 | 110 | Please report any issue you find in the issues page. Pull requests are more than welcome. 111 | -------------------------------------------------------------------------------- /src/AutoNumber.php: -------------------------------------------------------------------------------- 1 | $value) { 42 | if (is_null($value)) { 43 | throw new InvalidArgumentException($key.' param cannot be null'); 44 | } 45 | } 46 | 47 | return $config; 48 | } 49 | 50 | /** 51 | * Return the next auto increment number. 52 | * 53 | * @param string $name 54 | * @return int 55 | */ 56 | private function getNextNumber($name) 57 | { 58 | $autoNumber = AutoNumberModel::where('name', $name)->first(); 59 | 60 | if ($autoNumber === null) { 61 | $autoNumber = new AutoNumberModel([ 62 | 'name' => $name, 63 | 'number' => 1, 64 | ]); 65 | } else { 66 | $autoNumber->number += 1; 67 | } 68 | 69 | $autoNumber->save(); 70 | 71 | return $autoNumber->number; 72 | } 73 | 74 | /** 75 | * Generate auto number. 76 | * 77 | * @param Model $model 78 | * @return bool 79 | */ 80 | public function generate(Model $model) 81 | { 82 | $attributes = []; 83 | foreach ($model->getAutoNumberOptions() as $attribute => $options) { 84 | if (is_numeric($attribute)) { 85 | $attribute = $options; 86 | $options = []; 87 | } 88 | 89 | $config = $this->evaluateConfiguration($options); 90 | 91 | $uniqueName = $this->generateUniqueName( 92 | array_merge( 93 | ['class' => get_class($model)], 94 | Arr::except($config, ['onUpdate']) 95 | ) 96 | ); 97 | 98 | $autoNumber = $this->getNextNumber($uniqueName); 99 | 100 | if ($length = $config['length']) { 101 | $autoNumber = str_replace('?', str_pad($autoNumber, $length, '0', STR_PAD_LEFT), $config['format']); 102 | } 103 | 104 | $model->setAttribute($attribute, $autoNumber); 105 | 106 | $attributes[] = $attribute; 107 | } 108 | 109 | return $model->isDirty($attributes); 110 | } 111 | } 112 | --------------------------------------------------------------------------------