自定义主键后,需要注意的地方

订单Order模型覆盖主键后

protected $primaryKey = 'no';

关联模型OrderItem保存数据时报错(该模型主键获取到的是Order模型id主键数据,非定义的no字段的数据)

操作一:删除设置的覆盖主键

protected $primaryKey = 'no';

设置关联如下,提交数据正常

public function items() {
   return $this->hasMany(OrderItem::class,'order_id','no');
 }

无奈,重读 快速入门《Laravel 5.6 中文文档》 Eloquent 模型约定--主键 部分

使用非递增或者非数字的主键,则必须在模型上设置 public $incrementing = false 。

最后在原基础上加一句,解决问题。

protected $primaryKey = 'no';
public $incrementing = false;//加上这句

知识点:
非递增或者非数字的主键,需要加上

public $incrementing = false;

非整数主键,需要加上

protected $keyType = string;
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

题外话,主键还是使用id且自增int为好。
如有需要可以定义order_number或者number存储订单号。
不是很推荐用order_no. 这样的缩写。因为number标准的缩写是No. 并不适合编程命名

5年前 评论
fansj 4年前
fansj 4年前

@Max 个人见解,主键不使用自增是防猜单,小白入门学习折腾中

5年前 评论

@zoang 是的,所以可以过滤掉id,而使用number来进行检索order模型。 但是order_item中依旧使用order_id来关联order表的id。

5年前 评论

@Max 明白你的意思,哈

5年前 评论

protected $keyType = string; 写法错的,
protected $keyType = 'string';

4年前 评论

字符串类型的自定义主键值,在添加数据的时候应该怎么添加自定义的主键值?在laravel_admin创建添加页面时,id是不会显示id这个字段的

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!