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

时间:2018-12-20 10:06:00

标签: php mysql laravel

我想在数据库中以类似的增量创建自定义主ID

  • Comp-001
  • Comp-002
  • Comp-003

然后递增 Comp-00N

3 个答案:

答案 0 :(得分:2)

您需要在模型上设置公用$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();
      });

答案 1 :(得分:2)

因为我相信您可以设置得更简单,并且根据您的描述,您只需要这种显示解决方案,所以我决定为您提出解决方案:

公司型号

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

这样,您将尊重:

-> Laravel自然流;
->您保留真实的ID参考和视觉参考;
->您无需付出额外的努力来确保找到正确的产品(将ID保留为整数);

以上是解决问题的一种简单快捷的方法。

现在我不确定您如何构造代码,但是如果是我的项目,我什至不更改模型,并提供 Hydrator Marshaller 要抓住我的对象,请仅在视图上使用我需要的字段创建类似的表示形式,然后将其传递。

为什么?

->我的模型尽可能纯,没有解析信息(实际上不应该是模型对OOP的责任);

->我在后端和前端之间有了清晰的转换,并且可以轻松地针对不同的视图进行更改,而无需触及先前的代码(尊重OOP的打开和关闭法则);

答案 2 :(得分:0)

您可以使用Laravel ID generator

首先安装它: boxplot.stats

将类导入控制器。

barplot

现在只需使用

composer require haruncpi/laravel-id-generator

输出

use Haruncpi\LaravelIdGenerator\IdGenerator;