модель hasMany Связь с каким состоянием?

Я могу получить все статьи для каждой категории с помощью этого кода:

$category->article

Теперь я хочу получить все статьи с некоторым условием (в таблице статей)

я пробую это

$category->article->wherePublish(1)->
                    whereFeature('top')->latest()->
                    take(9)->get();

но я получаю эту ошибку:

Метод wherePublish не существует.


person Ali    schedule 08.12.2017    source источник


Ответы (1)


$category->article выполняет запрос, и вы получаете коллекцию. В коллекциях нет wherePublish и подобных магических методов, поэтому вы получаете ошибку.

Если вы хотите фильтровать статьи, используйте этот синтаксис:

Article::where('category_id', $category->id)
    ->wherePublish(1)
    ->whereFeature('top')
    ->latest()
    ->take(9)
    ->get();

Это будет работать для отношений hasOne и hasMany. Для belongsToMany используйте метод whereHas() вместо where().

В качестве альтернативы вы можете определить отдельные отношения, например:

public function filteredArticles()
{
    return $this->hasMany(Article::class, 'article_id')
        ->wherePublish(1)
        ->whereFeature('top')
        ->latest()
        ->take(9);
}

И используйте его:

$category->filteredArticles
person Alexey Mezenin    schedule 08.12.2017