我如何加入 Laravel 中的 whereDoesntHave

时间:2021-02-27 06:59:42

标签: laravel eloquent laravel-query-builder

我正在尝试在我的 Laravel 8.0 应用程序中运行查询。我在使用 whereDoesntHave() 中的 Laravel 概念进行连接(循环)时遇到问题。由于我使用的是 DB::table('...') 并且它实现了其他条件,因此我有一个 brands 表、projects 表和 project_associate_brand 表,brandmany-to-manyproject 的关系,我想找出品牌和项目彼此不关联的项目数,我试图两次加入表格以获取与其他项目相关联的项目一个删除它没有关系的地方,所以我的查询看起来像:

$innerQuery = DB::table('brands as b')
    ->join('project_associate_brand as  pabdoesnthave', 'b.id', '=', 'pabdoesnthave.brand_id')
    ->join('project_associate_brand as pab', function ($join) {
        $join->on('b.id', '!=', 'pab.brand_id')
            ->where('pabdoesnthave.project_id', '!=', 'pab.project_id');
    })
    ->join('projects as p', function ($join) {
        $join->on('pab.project_id', '=', 'p.id')
           ->where('pabdoesnthave.project_id', '!=', 'p.id');
    })
     ->select(DB::raw('b.id, b.title, COUNT(DISTINCT p.id) as projects_count'))
    ->whereNull('b.deleted_at')
    ->whereNull('p.deleted_at')
    ->groupByRaw('b.id');
    
    
return ProductBrandFilterResource::collection(DB::query()->fromSub($innerQuery, 't')
    ->select(DB::raw("
                id,
                `title`,
                projects_count
         "))
    ->orderBy('title', 'asc')
    ->groupBy('t.id')->get());

我无法获得想要的结果。为了更好地解释,我将表 porject_associate_brand 设为:

brand_id    project_id
    1           1
    1           2
    1           3
    2           1
    2           3

如果我想获取与项目无关的品牌列表,我会得到

id  title   project_count
1   ABC         3
2   PQR         3

对于 id 2,它给了我 3,但实际上它应该是 1 作为结果。

任何更好的方法表示赞赏。谢谢

0 个答案:

没有答案