Laravel 雄辩:外部查询中的别名不能在子查询中引用

Laravel 雄辩:外部查询中的别名不能在子查询中引用,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,我有以下疑问: DB::table('dining_tables as dt') ->whereNotExists(function($query){ $query ->from('booking_allocations as ba') ->join('time_slots as ts', 'ba.slot_id', '=', 'ts.id')

我有以下疑问:

DB::table('dining_tables as dt')
        ->whereNotExists(function($query){
            $query
                ->from('booking_allocations as ba')
                ->join('time_slots as ts', 'ba.slot_id', '=', 'ts.id')
                ->where('ba.booking_date', '=', '2019-01-27')
                ->where('ts.start_time', '>=', '12:00 PM')
                ->where('ts.end_time', '<=', '1:00 PM')
                ->where('ba.table_id', '=', 'dt.id')
                ->select(DB::raw('null'));
        })
        ->where('dt.capacity', '>=', 4)
        ->select('id')
        ->limit(1)
        ->get();
这给我留下了以下错误:

带有消息“SQLSTATE[22P02]”的/Database/QueryException: 无效的文本表示法:7错误:的输入语法无效 整数:dt.id SQL:从餐桌中选择id作为dt,其中 不存在从预订分配中选择null作为ba内部联接 ba.slot\u id=ts.id,其中 ba.预订日期=2019-01-27,ts.开始时间>=下午12:00和 ts.end_时间=4限值1'

我花了半天的时间才意识到这个替换代码可以避免错误:

->where('ba.table_id', '=', DB::raw('dt.id'))
注意:将DB::raw包装在有问题的别名周围

现在,查询按预期工作。我想了解这里可能发生的情况。

WherenoteExists内部提出了一个单独的查询:

只有db builder的“更高”实例才知道dt

因此,在嵌套的where中,db builder将其视为字符串,并且由于ba.table_id是一个整数,因此不能在该上下文中使用string类型的值


当您使用db raw时,它只是将其按原样放入sql中,在sql中它按假定的方式工作。

当您使用函数外部的变量时,您必须在函数中使用$variable。您是对的,除非他没有这样做。
->where('ba.table_id', '=', DB::raw('dt.id'))