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'))