Laravel 5.4 как получить статьи, связанные с категорией - PullRequest
0 голосов
/ 03 июля 2018

Я создаю простой каталог магазинов в Laravel 5.4. По сути, я хочу, чтобы в моей статье была кнопка, которая получала бы все статьи со связанными категориями (учитывая, что статья может иметь много категорий).

У меня есть модели Article и Category, а также сводная таблица article_category. Оба имеют отношение ко многим другим, как:

Код в артикуле модели:

public function categories()
{
    return $this->belongsToMany('App\Category');
}

код модели категории:

public function articles()
{
    return $this->belongsToMany('App\Article');
}

Моя проблема заключается в том, как получить список статей, включающих все статьи с категориями, относящимися к статье.

Это моя функция на контроллере прямо сейчас, он получает объект JSON со списком категорий:

public function showRelatedArticles($category) 
{
    // Decode JSON to PHP array
    $category = json_decode($category);
    $collection;
    if(is_array($category)){
        foreach ($category as $cat) {
            $articles = Article::whereHas('Category', function ($query) {
                $query->where('category_id', $cat->id);
            })->get();
            $collection = merge($articles);
        }
    } else {
        dd('Not array');
    }

    return view('front', ['articles' => $collection]);
}

Это возвращает ошибку:

BadMethodCallException
Вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: Category ()

Возможно, у меня неправильный тип отношений между моими моделями, но это правильный метод объявления отношения «многие ко многим», не так ли?

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете переписать всю часть так:

if (is_array($category)){
    $category_ids = collect($category)->pluck('id');

    $articles = Article::whereHas('categories', function($query) use ($category_ids) {
        // Assuming your category table has a column id
        $query->whereIn('categories.id', $category_ids);
    })->get();
} else {
    dd('Not array');
}

Обратите внимание на строчную букву categories, которая является именем функции в классе Article.

Сочетает in из запросов, collect для массивов и извлекает только те статьи, которые связаны с указанными категориями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...