我正在尝试在我的 Laravel 8.0
应用程序中运行查询。我在使用 whereDoesntHave()
中的 Laravel
概念进行连接(循环)时遇到问题。由于我使用的是 DB::table('...')
并且它实现了其他条件,因此我有一个 brands
表、projects
表和 project_associate_brand
表,brand
在many-to-many
与 project
的关系,我想找出品牌和项目彼此不关联的项目数,我试图两次加入表格以获取与其他项目相关联的项目一个删除它没有关系的地方,所以我的查询看起来像:
$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 作为结果。
任何更好的方法表示赞赏。谢谢