在我的代码中,我在数据库中插入了一个新行:
$post = new Post;
$post->user_id = Auth::user()->id;
// more inserts
$post->save();
在我的Post.php
中,我有:
protected $with = [
'user', 'answers', 'questions'
];
public function users()
{
return $this->belongsTo('App\User');
}
// etc
但是当我插入后返回$post
时,没有关联(users
,answers
,questions
)。
如何在插入后加载所有默认关系?
答案 0 :(得分:4)
save()
方法将数据保存到数据库,但它不会刷新模型上的数据或重新加载关系。
最简单的解决方案是在调用save()
后刷新对象。这将自动加载您在模型上$with
属性中定义的关系:
// ...
$post->save();
// refresh the post from the database
$post = $post->fresh();
另一种选择是使用load()
方法自行手动重新加载关系。
// ...
$post->save();
// reload the desired relationships
$post->load(['user', 'answers', 'questions']);
但是,这会复制定义您希望自动加载的关系的代码(在模型中定义一次,然后在此代码中定义一次)。您可以通过在模型上创建新功能来缓解这种情况。
// in Post model
public function reloadRelations() {
$this->load($this->with);
}
// code usage
// ...
$post->save();
// call your new function to reload the relations
$post->reloadRelations();
然而,仅通过调用内置fresh()
方法来实现此路由的唯一真正好处是,这不会重新运行查询以获取原始Post
数据。
如果你每秒处理1000个请求,也许一个查询可能有所不同,但除此之外,我不会担心它,只需使用fresh()
方法。但是,您可以选择这些选项。
答案 1 :(得分:1)
您应该使用user_id
类中的关联方法,而不是手动设置属性\Illuminate\Database\Eloquent\Relations\BelongsTo
。
$post->user()->associate(Auth::user());
// now you have the user inside your post.
dd($post->user);
答案 2 :(得分:-1)
可能是,模型Post.php:
protected $primaryKey = 'id';
public function users()
{
return $this->hasOne('App\User', 'id', 'user_id');
}
之前: 迁移“帖子”
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
// .....
});
希望这可以解决您的问题