Laravel Eloquent关联:如何同时保存Article的User与Category关联?
解决Laravel中同时关联User和Category创建Article的问题
嘿,这事儿很简单,Laravel给了好几种优雅的方式来实现,我给你列几个常用的:
方法1:直接设置category_id属性后保存
你可以在创建Article实例的时候直接传入category_id,或者之后手动赋值,然后通过User的关联关系保存:
public function test() { $user = Auth::user(); $category = Category::find(2); // 方式A:创建实例时直接传入category_id $article = new Article(['name' => 'test', 'category_id' => $category->id]); $user->articles()->save($article); // 方式B:先实例化再赋值 $article = new Article(['name' => 'test']); $article->category_id = $category->id; $user->articles()->save($article); }
方法2:使用关联的create方法批量赋值
如果你的Article模型已经设置了$fillable允许批量赋值,直接用create方法一步到位最省事:
public function test() { $user = Auth::user(); $category = Category::find(2); $article = $user->articles()->create([ 'name' => 'test', 'category_id' => $category->id ]); }
注意:别忘在Article模型里添加允许批量赋值的字段,否则会触发批量赋值保护错误:
class Article extends Model{ protected $fillable = ['name', 'user_id', 'category_id']; // 你的关联方法... }
方法3:使用associate方法关联Category
既然Article和Category是belongsTo关系,你可以用associate方法直接关联Category实例,不用手动处理id,代码更优雅:
public function test() { $user = Auth::user(); $category = Category::find(2); $article = new Article(['name' => 'test']); $article->category()->associate($category); // 自动设置category_id字段 $user->articles()->save($article); }
这几种方法都能实现你的需求,选哪种看你个人习惯——如果已经拿到了Category实例,用associate会更贴合Laravel的关联设计;如果只是有分类id,直接赋值或者用create更直接高效。
内容的提问来源于stack exchange,提问作者tirael8
相关产品推荐
相关产品推荐

