插入后获取关系

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 插入后,没有任何关系(usersanswersquestions)附加到它。

如何在插入后加载所有默认关系?

可能是,在模型中 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() 方法即可。但是,这里的选项供您选择。