我正在Laravel 8.0
上构建一个应用程序,我试图获取与DB
语句的连接中不存在的关系。我没有得到预期的结果
我试过使用
public function ProductList() {
$innerQuery = DB::table('projects as p')
->join('construction_product_projects as cpp', 'p.id', '=', 'cpp.project_id')
->join('construction_product as cp', 'cpp.construction_product_id', '=', 'cp.id')
->where('cp.status', 'saved')
->join('project_associate_brand as pab', function ($join){
$join->on('cp.id', '=', 'pab.construction_product_id')
->when(request('group'), function ($q) {
$q->whereIn('pab.product_group_id', collect(request('group'))->pluck('id'));
})
->when(request('brand'), function ($q) {
$q->whereIn('pab.brand_id', collect(request('brand'))->pluck('id'))
->when(request('equivalent'), function ($q){
$q->where('pab.equivalent',true); //where project_associate_brand.equivalent is true
});
})
->when(request('brand_doesnt_have'), function ($q) {
// This is not working...
$q->whereNotIn('pab.brand_id', collect(request('brand_doesnt_have'))->pluck('id'));
});
})
->leftjoin('Construction_product_attachments as cpa', 'cpa.construction_product_id', '=', 'cp.id')
->select(DB::raw("p.id, p.slug, p.name, cp.updated_at"))
->whereNull('p.deleted_at')
->whereNull('cp.deleted_at')
->whereNull('cpa.deleted_at')
->groupByRaw('p.id');
return ProductListResource::collection(
DB::query()->fromSub($innerQuery, 't')
->select(DB::raw("id, slug, name, updated_at, attachments"))
->groupBy('t.id')
->paginate(50)
);
}
所以这不起作用,所以我尝试使用whereExists
和whereNotIn
条件:
$q->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('project_associate_brand')
->whereNotIn('project_associate_brand.brand_id', collect(request('brand_doesnt_have'))->pluck('id'));
});
欢迎任何更好的方法。谢谢。
PS:我也尝试使用该功能whereNotExists
但不起作用。我不能使用Eloquent
和whereDoesntHave
,因为我在其中执行了很多复杂的查询/条件。
编辑:
我尝试在toSql()
的帮助下生成查询生成器,但得到了以下输出:
选择 p.id、p.slug、p.name cp.updated_at 从projects
作为p
内部联接construction_product_projects
作为p
上的cpp
。id
=cpp
.project_id
内部联接construction_product
作为cpp
上的cp
。construction_product_id
=cp
.id
内部连接project_associate_brand
作为cp
上的pab
。id
=pab
.construction_product_id
和pab
.brand_id
不在(?)的地方p
.deleted_at
为空且cp
。deleted_at
为空分组 p.id
但这是意料之外的。我的期望如下:
从不存在的projects
中选择 *(从brands
brands
的内部联接project_associate_brand
中选择 *。id
=project_associate_brand
.brand_id
projects
的地方.id
=project_associate_brand
.project_id
和project_associate_brand
.brand_id
不在(?)和brands
.deleted_at
为空)和projects
.deleted_at
为空
查询应该具有我的代码中不存在的where not exists
。
您需要在此处使用 whereNot 必须在查询中具有等效的 where 不存在子句。您期望的简单表示形式是:
Projects::whereDoesntHave('project_associate_brand', function($query) {
$query->join('brands', function($join) {
$join->on('brands.id','=','project_associate_brand.brand_id')
->whereNull('brands.deleted_at');
});
$query->whereNotIn('project_associate_brand.brand_id',[?])
})