在使用 laravel 范围创建查询时使用 except
Posted
技术标签:
【中文标题】在使用 laravel 范围创建查询时使用 except【英文标题】:Using except when creating query with laravel scope 【发布时间】:2021-10-16 11:25:23 【问题描述】:当我键入第二个 where 时,查询无法正常工作。 数据库行:
batch_id - sub_stage_id
1 - 空 1 - 空 1 - 空 1 - 28 2 - 空 2 - 空 2 - 空 2 - 空我正在将 substage 发送到范围内。我希望它返回 Null 的,而不是等于 sub_stage_id 的那些
public function scopeBatchSubStageReady($query,$subStage,$stage = "Data Collection")
$stage_id = JRoadStage::findStageId($stage);
$sub_stage_id = JRoadStage::findStageId($subStage);
return $query->whereHas('roads',function (Builder $query) use($stage_id,$sub_stage_id)
$query->items()->where(function (Builder $query) use($stage_id,$sub_stage_id)
//substage equal null
$query->where('stage_id',$stage_id)
->whereNull('sub_stage_id')
->where("is_here",true);
)->where(function (Builder $query) use($stage_id,$sub_stage_id)
//not equal to substage
$query->where('stage_id',$stage_id)
->where('sub_stage_id','!=',$sub_stage_id);
);
);
当我把第二个放在哪里时,它没有给出任何结果。当我不这样做时,它会给出 batch_id 1 和 2。我想要的是因为我发送的子阶段而只给batch_id 2。
$readyForItems = BatchItem::BatchSubStageReady("Screening")->get();
dd(readyForItems);
如何在范围方法中修复我的查询?
【问题讨论】:
如果您有多个应该使用 orWhere 的地方。你试过吗? 当我尝试 orWhere 时,它返回 batch_id 1 和 2 但我想要的结果只有 2。 @Timmy 我尝试使用 whereDoesntHave 并且它有效。还是谢谢 【参考方案1】:您需要的是 whereDoesntHave。你可以试试这个吗?
$query->whereHas('roads',function (Builder $query) use($stage_id,$sub_stage_id)
$query->items()->where(function (Builder $query) use($stage_id,$sub_stage_id)
$query->where('stage_id',$stage_id)
->whereNull('sub_stage_id')
->where("is_here",true);
);
)->whereDoesntHave('roads',function (Builder $query) use($stage_id,$sub_stage_id)
$query->items()->where(function (Builder $query) use($stage_id,$sub_stage_id)
$query->where('stage_id',$stage_id)
->where('sub_stage_id',$sub_stage_id);
);
);
【讨论】:
以上是关于在使用 laravel 范围创建查询时使用 except的主要内容,如果未能解决你的问题,请参考以下文章
查询在 MySQL 中有效,但不能通过 Lumen/Laravel - 数值超出范围:1416
在 Swift 中使用泛型、协议和继承创建对象时的 EXC_BAD_ACCESS