【问题标题】:Eloquent Query: All News with same categories. Pivot tableEloquent Query:所有具有相同类别的新闻。数据透视表
【发布时间】: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();

但此选项会返回所有新闻。

我需要所有相关的新闻,我的意思是具有相似类别的新闻。数据透视表让我头疼。

提前致谢!

【问题讨论】:

    标签: laravel eloquent pivot-table relationship


    【解决方案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 } 我什么也得不到。为什么?
    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多