插入

时间:2016-09-16 00:25:16

标签: php laravel laravel-5 eloquent laravel-5.3

在我的代码中,我在数据库中插入了一个新行:

$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时,没有关联(usersanswersquestions)。

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

3 个答案:

答案 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');
            // .....

        });

希望这可以解决您的问题