我需要在Eloquent查询中获取与特定新闻具有相同(一个或多个)类别的所有新闻。而且我不了解数据透视表。
我有3张桌子:
新闻
ant design
NewsxCategory (数据透视表)
id | title | content
新闻类别
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
但是此选项返回所有新闻。
我需要所有与新闻相关的信息,我的意思是具有相似类别的新闻。数据透视表让我头疼。
谢谢!
答案 0 :(得分:2)
在whereIn
子句中,您需要传递ID数组。但是你没有通过正确。
这是正确的。
/**
* 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