Отношение к запросам
У меня есть модель 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();
Ответы
Ответ 1
Любой из них должен работать для вас, выберите тот, который вам нравится больше всего:
-
Нетерпеливая загрузка.
$comments = News::find(123)->with(['comments' => function ($query) {
$query->where('trashed', '<>', 1);
}])->get();
Вы можете ввести параметр в функцию запроса с use($param)
метода use($param)
, который позволяет использовать динамическое значение запроса во время выполнения.
-
Ленивая загрузка
$news = News::find(123);
$comments = $news->comments()->where('trashed', '<>', 1)->get();
Я не мог не заметить, однако, что вы, вероятно, пытаетесь сделать мягкое удаление, и что Laravel имеет встроенную функциональность, чтобы помочь вам с этим: http://laravel.com/docs/eloquent# мягкое удаление
Ответ 2
Ответ 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
Ответ 3
Вы можете сделать просто в своем красноречивом файле модели.
сделайте вот так:
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');