如何在 DB 语句中查找与 Larawel 中的连接关系缺失



我正在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)
);
}

所以这不起作用,所以我尝试使用whereExistswhereNotIn条件:

$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但不起作用。我不能使用EloquentwhereDoesntHave,因为我在其中执行了很多复杂的查询/条件。

编辑:

我尝试在toSql()的帮助下生成查询生成器,但得到了以下输出:

选择 p.id、p.slug、p.name cp.updated_at 从projects作为p内部联接construction_product_projects作为p上的cppid=cpp.project_id内部联接construction_product作为cpp上的cpconstruction_product_id=cp.id内部连接project_associate_brand作为cp上的pabid=pab.construction_product_idpab.brand_id不在(?)的地方p.deleted_at为空且cpdeleted_at为空分组 p.id

但这是意料之外的。我的期望如下:

从不存在的projects中选择 *(从brandsbrands的内部联接project_associate_brand中选择 *。id=project_associate_brand.brand_idprojects的地方.id=project_associate_brand.project_idproject_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',[?])
})

相关内容

  • 没有找到相关文章

最新更新