Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在laravel中生成自定义主id?_Php_Mysql_Laravel - Fatal编程技术网

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

Php 如何在laravel中生成自定义主id?,php,mysql,laravel,Php,Mysql,Laravel,我想在数据库中用增量创建自定义主id,如 Comp-001 Comp-002 Comp-003 然后增加 Comp-00N您需要设置public$incrementing=false,这样它就不会尝试将主键设置为下一个自动递增的ID值 然后您就可以创建自定义主键了 class Company extends Model { protected $primaryKey = 'id'; public $incrementing = false; // You most pro

我想在数据库中用增量创建自定义主id,如

  • Comp-001
  • Comp-002
  • Comp-003
然后增加
Comp-00N

您需要设置public
$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();
      });

因为我相信您可以将其设置得更简单,并且根据您所描述的,您实际上只需要此类显示解决方案,所以我决定为您提出一个解决方案:

公司模式

class Company extends Model
{
    ...

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

处理公司对象时,只需在需要显示时调用您的方法:

$company->getCompanyID();
以下是一些有关其行为的示例:

ID示例和各自的输出:

IDs             Outputs
 1              Comp-001 
 45             Comp-045 
 104            Comp-104
 1000           Comp-1000
这样,您将尊重:

->拉威尔自然流
->您保留一个真实的ID引用和一个视觉引用
->您不需要额外的努力来确保找到正确的产品(您将ID保持为整数)

以上是一个简单而快速的解决您的问题的方法

现在我不确定您是如何构造代码的,但如果是我的项目,我甚至不会更改模型,并提供Marshaller来获取我的对象,创建一个类似的表示,仅使用我在视图上所需的字段,并传递它

为什么?

->我的模型是一个尽可能纯的模型,没有解析信息(这真的不应该是面向对象的模型职责)

->我在后端和前端之间有一个清晰的转换,我可以很容易地为不同的视图进行更改,而不必接触以前的代码(尊重OOP的开放和关闭法则)

您可以使用

首先安装它:
编写器需要haruncpi/laravel id生成器

在控制器中导入类

use Haruncpi\LaravelIdGenerator\IdGenerator;
现在只需使用它

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

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

在插入触发器之前创建一个触发器。到目前为止,您已经尝试过了为什么麻烦呢,surley
Comp
位只与用户看到的内容相关,因此,只需将
Comp-
位添加到演示层中任何用户可见的信息中。您需要编写自定义代码来创建增量,因为这是一个字符串而不是一个数字。是否可以保留传统的Int-ID,只需创建一个模型方法
getID
,将Comp-添加到您的ID中?您可能还需要使用例如
creating
将在插入新条目时增加自定义
id
值的责任委托给模型。如何以及在何处创建自定义主键?请使用更新的代码进行检查。我希望它能帮助您,但是在哪里使用
$id=IdGenerator::generate(['table'=>'your_table_name','length'=>8',prefix'=>'Comp-')
公共函数存储()中或其他地方?是的,在存储方法或模型中。获取完整文档: