【问题标题】:Using except when creating query with laravel scope在使用 laravel 范围创建查询时使用 except
【发布时间】: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 并且它有效。还是谢谢

标签: laravel eloquent laravel-8 laravel-query-builder


【解决方案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);

        });
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 2015-09-05
    • 1970-01-01
    • 2017-12-17
    • 2015-06-13
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多