如何不获取多对多关系的相关对象

时间:2019-02-22 06:04:43

标签: php mysql laravel-5 query-builder

我有usernews表,然后有一个名为news_user的中间表,该中间表确定用户看到了哪些新闻。我可以轻松地获得已被看到的对象,但是现在我需要向用户展示未被看到的对象。

我做了一个变通方法,将所有可见的news ID放入数组中,并寻找news,其中id与数组不同。但我不认为这是最健康的解决方案。

这就是我所做的:

$seenNewses = DB::table('news_user')->where('user_id', Auth::id())
->pluck('news_id')->toArray();

$notSeenNewses = News::whereNotIn('id', $seenKeepers)
->orderBy('id', 'asc')->first();

有没有一种方法可以通过单个查询做到这一点?

P.S:我看到了类似的问题,但是他们并没有感到困惑。任何答案表示赞赏。

1 个答案:

答案 0 :(得分:0)

首先要在新闻模型中建立这样的关系

public function users()
{
  return $this->belongsToMany(News::class,'news_user','news_id','user_id');
}

以下命令将为您提供所有用户尚未看到的所有新闻

$notSeenNewses = News::doesntHave('users')->get();

如果您想提出任何条件,请同时检查

$notSeenNewses = News::whereDoesntHave('users', function ($query) {
    $query->where('YOUR CONDITION');
})->get();

未经测试,但是您可以根据需要进行修改。