Отношение к запросам

У меня есть модель 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

Любой из них должен работать для вас, выберите тот, который вам нравится больше всего:

  1. Нетерпеливая загрузка.

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

    Вы можете ввести параметр в функцию запроса с use($param) метода use($param), который позволяет использовать динамическое значение запроса во время выполнения.

  2. Ленивая загрузка

    $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');