查询关系Eloquent



我有News模型,News有很多注释,所以我在News模型中这样做:

public function comments(){
    $this->hasMany('Comment', 'news_id');
}

但我在comments表中也有字段trashed,我只想选择未被丢弃的注释。所以trashed <> 1。所以我想知道有没有这样的方法:

$news = News::find(123);
$news->comments->where('trashed', '<>', 1); //some sort of pseudo-code

有没有一种方法可以使用上面的方法,或者我应该写这样的东西:

$comments = Comment::where('trashed', '<>', 1)
    ->where('news_id', '=', $news->id)
    ->get();

任何一个都应该适用,选择你最喜欢的:

  1. 急切的装载。

    $comments = News::find(123)->with(['comments' => function ($query) {
        $query->where('trashed', '<>', 1);
    }])->get();
    

    您可以通过use($param)方法将参数注入查询函数,这允许您在运行时使用dynemic查询值。

  2. 延迟加载

    $news = News::find(123);
    $comments = $news->comments()->where('trashed', '<>', 1)->get();
    

不过,我忍不住注意到,你可能想做的是处理软删除,而Laravel有内置功能可以帮助你做到这一点:http://laravel.com/docs/eloquent#soft-删除

您可以在雄辩的模型文件中简单地执行此操作。这样做:

public function comments_with_deleted()
{
    return $this->belongsTo('Comments', 'id')->where('deleted', 1);
}
public function comments()
{
    return $this->belongsTo('Comments', 'id');
}

这样调用:

// for show comments with deleted
$comments = News::find(123)->with('comments_with_deleted');
// for show comments without deleted
$comments = News::find(123)->with('comments');

rmobis的答案是我需要的,但它在当前的Laravel 5中抛出了一个错误。您现在必须将其用作关联数组:

$comments = News::find(123)->with(['comments' => function ($query) {
    $query->where('trashed', '<>', 1);
}]);

我花了一些时间才弄清楚,希望这能帮助其他人。

阅读更多Laravel的文档(5.6):https://laravel.com/docs/5.6/eloquent-relationships#querying-关系

最新更新