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关于加入关系的条款

从父多对多关系获取所有子模型 Laravel Eloquent

Wordpress - 在类别存档中使用 wp_query - 如何显示适当的类别?

为啥这些具有完全相同类别的按钮宽度不同?

在一个查询中使用具有多个关联数组的 laravel eloquent 获取数据

如何在包含具有 Eloquent 的对象数组的 json 字段中求和