$order->items ()->make ([...]) 的疑问

下面这段代码是教材里的写法

    $sku = ProductSku::find($data['sku_id']);
    // 创建一个 OrderItem 并直接与当前订单关联
    $item = $order->items()->make([
        'amount' => $data['amount'],
        'price'  => $sku->price,
    ]);
    $item->product()->associate($sku->product_id);
    $item->productSku()->associate($sku);
    $item->save();

感觉不够简洁,于是我简化成如下这段

    $sku = ProductSku::find($data['sku_id']);
    $order->items()->make([
        'amount' => $data['amount'],
        'price'  => $sku->price,
        'product_id'=>$sku->product->id, //外键1赋值无效
        'product_sku_id'=>$sku->id,         //外键2赋值无效
    ])->save();

可为什么这样写就不行呢?程序报错:'product_id' doesn't have a default value
可我明明在数组里面给外键1和外键2都设过值了,为什么会无效呢?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
leo
最佳答案

因为这两个字段没有在 fillable 里面,Laravel 的推荐写法就是通过关联关系的 associate() 方法。

5年前 评论
讨论数量: 3
leo

因为这两个字段没有在 fillable 里面,Laravel 的推荐写法就是通过关联关系的 associate() 方法。

5年前 评论
leo

因为这两个字段没有在 fillable 里面,Laravel 的推荐写法就是通过关联关系的 associate() 方法。

5年前 评论

@leo 一句惊醒梦中人,谢谢老师!我马上把这两个外键添加到 fillable 里面去!

5年前 评论

@leo OK了!
protected $fillable=[
'amount', 'price', 'rating', 'review', 'review_at', 'product_id', 'product_sku_id'
];
果然,加上之后顺利解决……原来这么简单!我还浪费了好几天去钻牛角尖了(百度了好几篇Laravel源码的文章),看得云里雾里的。

5年前 评论

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