插入后获取关系
Get relationships after insert
在我的代码中,我向数据库中插入了一个新行:
$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
但是当我 return $post
插入后,没有任何关系(users
、answers
、questions
)附加到它。
如何在插入后加载所有默认关系?
可能是,在模型中 Post.php:
protected $primaryKey = 'id';
public function users()
{
return $this->hasOne('App\User', 'id', 'user_id');
}
之前:
迁移 "posts"
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
// .....
});
希望这能解决您的问题
您应该使用 \Illuminate\Database\Eloquent\Relations\BelongsTo
class.
中的关联方法,而不是手动设置属性 user_id
$post->user()->associate(Auth::user());
// now you have the user inside your post.
dd($post->user);
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()
方法即可。但是,这里的选项供您选择。
在我的代码中,我向数据库中插入了一个新行:
$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
但是当我 return $post
插入后,没有任何关系(users
、answers
、questions
)附加到它。
如何在插入后加载所有默认关系?
可能是,在模型中 Post.php:
protected $primaryKey = 'id';
public function users()
{
return $this->hasOne('App\User', 'id', 'user_id');
}
之前: 迁移 "posts"
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
// .....
});
希望这能解决您的问题
您应该使用 \Illuminate\Database\Eloquent\Relations\BelongsTo
class.
user_id
$post->user()->associate(Auth::user());
// now you have the user inside your post.
dd($post->user);
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()
方法即可。但是,这里的选项供您选择。