Eloquent Query: Все новости с теми же категориями.Сводная таблица - PullRequest
2 голосов
/ 07 июня 2019

Мне нужно получить все новости, которые имеют те же (одну или несколько) категорий, что и конкретные новые в запросе Eloquent.И я не знаю, с помощью сводной таблицы.

У меня есть 3 таблицы:

Новости

id | title | content

NewsxCategory (PivotТаблица)

news_id | category_id

НовостиКатегория

id | name

Красноречивые модели

// NewsCategory model
class NewsCategory extends Model
{

}

// News Model
class News extends Model
{

    public function categories()
    {
        return $this->belongsToMany(NewsCategory::class, 'news_x_category', 'news_id', 'category_id');
    }

}

Я пробовал это.

В помощнике:

/**
 *  only related news
 *
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public static function relatedNews(News $new)
{
    $categories = $new->categories(); //obtain all categories of $new

    return News::whereHas('categories', function ($query) use ($categories) {
        $query->whereIn('new_id', $categories);
    });
}

И в поле зрения:

<div class="related-articles">
    <h5>{{ __('RELATED ARTICLES') }}</h5>
    <ul class="articles">
       @foreach ( App\Helpers\News::relatedNews($newsItem) as $new)
            <li>
                <h6>{{ $new->title }}</h6>
                <p>{{ $new->publication_date }}</p>
            </li>
       @endforeach
    </ul>
</div>

Но помощник всегда возвращает null.

Также я пытался в помощнике:

return News::with('categories')->where('category_id',$categories )->get();

Но эта опция возвращает все новости.

Мне нужны все новости, я имею в виду новости с похожими категориями.Сводные таблицы вызывают головную боль.

Заранее спасибо!

1 Ответ

2 голосов
/ 07 июня 2019

В предложении whereIn необходимо передать массив идентификаторов. Но вы не проходите правильно.

Так что вот правильный.

/**
 *  only related news
 *
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public static function relatedNews(News $new)
{
    $categoryIds = $new->categories->pluck('category_id')->toArray(); //obtain all categories of $new

    return News::whereHas('categories', function ($query) use ($categoryIds) {
        $query->whereIn('category_id', $categoryIds);
    });
}

Я думаю, что после изменения выше функция меняется. вы получите соответствующие новости.

Обновлено

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

@foreach ( App\Helpers\News::relatedNews($newsItem)->get() as $new)
    {{ $new->title }}
@endforeach
...