我有News
模型,News
有很多评论,所以我在News
模型中执行了此操作:
public function comments(){
$this->hasMany('Comment', 'news_id');
}
但我在trashed
表中也有字段comments
,我只想选择未被删除的注释。所以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();
答案 0 :(得分:20)
其中任何一个都适合你,选择你最喜欢的那个:
乐意加载。
$comments = News::find(123)->with('comments', function ($query) {
$query->where('trashed', '<>', 1);
});
延迟加载
$news = News::find(123);
$comments = $news->comments()->where('trashed', '<>', 1)->get();
我忍不住注意到,你可能要做的就是处理软删除,Laravel有内置的功能来帮助你:http://laravel.com/docs/eloquent#soft-deleting
答案 1 :(得分:14)
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-relations
答案 2 :(得分:6)
您可以在您雄辩的模型文件中轻松完成。 这样做:
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');