Eloquent Query:所有具有相同类别的新闻。数据透视表
Posted
技术标签:
【中文标题】Eloquent Query:所有具有相同类别的新闻。数据透视表【英文标题】:Eloquent Query: All News with same categories. Pivot table 【发布时间】:2019-10-22 17:17:22 【问题描述】:我需要在 Eloquent 查询中获取与特定新闻具有相同(一个或多个)类别的所有新闻。而且我不知道数据透视表。
我有 3 张桌子:
新闻
id | title | content
NewsxCategory(数据透视表)
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】:在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
【讨论】:
感谢您的帮助,但帮助者仍然返回 0 个消息。我也尝试过: $categoryIds = $newsItem->categories()->pluck('category_id') 并且我获得了一个包含这个新类别的集合。但结果是一样的…… 你能试试这个`$categoryIds = $new->categories->pluck('category_id')->toArray();`吗? 这种方式如果我使用 App\Helpers\News::relatedNews($newsItem)->count() 获得 3。那是正确的。但是当我尝试访问:@foreach ( App\Helpers\News::relatedNews($newsItem) as $new) $new->title 我什么也得不到。为什么?以上是关于Eloquent Query:所有具有相同类别的新闻。数据透视表的主要内容,如果未能解决你的问题,请参考以下文章
从父多对多关系获取所有子模型 Laravel Eloquent
Wordpress - 在类别存档中使用 wp_query - 如何显示适当的类别?