我希望在数据库中创建具有增量的自定义主id,如
然后增加Comp-00N。
发布于 2018-12-20 10:14:23
您需要在模型上设置公共$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();
});
发布于 2018-12-20 13:13:18
因为我相信您可以将此设置得更简单,而且从您所描述的情况来看,您只需要这样的解决方案来展示,所以我决定为您提出一个解决方案:
公司模式
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引用和一个可视引用;
->您不需要额外的努力来确保找到正确的产品(您将ID保持为整数);
上面是一个简单而快速的解决你问题的方法。
现在我不知道您是如何构造代码的,但是如果这是我的项目,我甚至不会更改模型,并提供一个Hydrator或Marshaller来获取我的对象,用视图上我需要的字段创建一个类似的表示,并将其传递给它。
为什么?
-> Model是一个纯的、没有解析信息的模型(这实际上不应该是OOP的模型响应性);
->我得到了后端和前端之间的一个清晰的转换,我可以很容易地更改不同的视图,而不必触及以前的代码(尊重OOP的开放和闭包规则);
发布于 2019-10-27 09:19:52
您可以使用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
...
https://stackoverflow.com/questions/53866420
复制相似问题