我想在数据库中创建自定义的主id组件-001组件-002组件-003然后增加comp-00n
q9rjltbz1#
你需要公开 $incrementing = false; 以便它不会尝试将主键设置为下一个自动递增的id值。然后您就可以创建自定义主键了。
$incrementing = false;
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();});
id
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的开放和封闭法则);
2wnc66cl3#
你可以使用laravel id生成器。首先安装: composer require haruncpi/laravel-id-generator 在控制器中导入类。
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 ...
3条答案
按热度按时间q9rjltbz1#
你需要公开
$incrementing = false;
以便它不会尝试将主键设置为下一个自动递增的id值。然后您就可以创建自定义主键了。
然后可以为生成自定义值
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();
});
wecizke32#
因为我相信你可以把这个设置得更简单,而且从你描述的情况来看,你只需要这样的解决方案来展示,所以我决定为你提出一个解决方案:
公司模型
你的观点
处理company对象时,需要显示时只需调用方法:
下面是一些关于这将如何表现的例子:
id示例和各自的输出:
这样你就会尊重:
->拉威尔自然流;
->你保持一个真实的身份证明和一个视觉证明;
->您不需要额外的努力来确保找到正确的产品(您将id保持为整数);
以上是一个简单而快速的解决你的问题。
现在我不确定您是如何构建代码的,但是如果是我的项目,我甚至不会更改模型,也不会提供一个hydrator或marshaller来获取我的对象,创建一个类似的表示,只在视图上使用我需要的字段,并传递它。
为什么?
->我的模型是一个尽可能纯的模型,没有解析信息(这真的不应该是面向对象的模型职责);
->我在后端和前端之间有一个清晰的转换,我可以很容易地改变不同的视图,而不必接触以前的代码(尊重oop的开放和封闭法则);
2wnc66cl3#
你可以使用laravel id生成器。
首先安装:
composer require haruncpi/laravel-id-generator
在控制器中导入类。现在就用它吧
输出