如何在laravel中生成自定义主id?

vbkedwbf  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(378)

我想在数据库中创建自定义的主id
组件-001
组件-002
组件-003
然后增加comp-00n

q9rjltbz

q9rjltbz1#

你需要公开 $incrementing = false; 以便它不会尝试将主键设置为下一个自动递增的id值。
然后您就可以创建自定义主键了。

class Company extends Model {

    protected $primaryKey = 'id';
    public $incrementing = false;  // You most probably want this too

}

然后可以为生成自定义值 id ```
$lastCompanyId = Company::select('id')->orderBy('id','desc')->first();
$lastCompanyId=(int)substr($lastCompanyId , -3);
static::created(function ($obj) {
$obj->id= Company::'Comp-'.$lastCompanyId+1;
$obj->save();
});

wecizke3

wecizke32#

因为我相信你可以把这个设置得更简单,而且从你描述的情况来看,你只需要这样的解决方案来展示,所以我决定为你提出一个解决方案:
公司模型

class Company extends Model
{
    ...

   public function getCompanyID()
   {
       return sprintf('Comp-%03d', $this->id);
   }
}

你的观点
处理company对象时,需要显示时只需调用方法:

$company->getCompanyID();

下面是一些关于这将如何表现的例子:
id示例和各自的输出:

IDs             Outputs
 1              Comp-001 
 45             Comp-045 
 104            Comp-104
 1000           Comp-1000

这样你就会尊重:
->拉威尔自然流;
->你保持一个真实的身份证明和一个视觉证明;
->您不需要额外的努力来确保找到正确的产品(您将id保持为整数);
以上是一个简单而快速的解决你的问题。
现在我不确定您是如何构建代码的,但是如果是我的项目,我甚至不会更改模型,也不会提供一个hydrator或marshaller来获取我的对象,创建一个类似的表示,只在视图上使用我需要的字段,并传递它。
为什么?
->我的模型是一个尽可能纯的模型,没有解析信息(这真的不应该是面向对象的模型职责);
->我在后端和前端之间有一个清晰的转换,我可以很容易地改变不同的视图,而不必接触以前的代码(尊重oop的开放和封闭法则);

2wnc66cl

2wnc66cl3#

你可以使用laravel id生成器。
首先安装: composer require haruncpi/laravel-id-generator 在控制器中导入类。

use Haruncpi\LaravelIdGenerator\IdGenerator;

现在就用它吧

$id = IdGenerator::generate(['table' => 'your_table_name', 'length' => 8, 'prefix' =>'Comp-']);

输出

Comp-001
Comp-002
Comp-003
...

相关问题