这是我的尝试:
$calendar = Calendar::leftJoin("class", "class.start_date", "<=", "calendar.date")
->leftJoin("student", "class.id", "student.class_id")
->where("student.id", $id)
->select("calendar.date");
$calendarQuery = $calendar->toSql();
$temperature = Temperature
::leftJoin("temperature_type", "temperature.temperature_type_id", "temperature_type.id")
->where("temperature.student_id", $id)
->select("temperature.student_id", "temperature.id", DB::raw("date(temperature.created_at) as date"), DB::raw("cast(temperature.created_at as time) as time"), "status", "temperature_type_id", "temperature_type.name as temperature_type", "temperature.temperature", "temperature.unit")
->orderby("temperature.id");
$temperatureQuery = $temperature->toSql();
$return['output'] = DB::table(DB::raw("($temperatureQuery) AS temp"))
->rightJoin(DB::raw("($calendarQuery) AS cal"),
function($join) use ($calendar){
$join->on("temp.date", "=" ,"cal.date")
->addBinding($calendar->getBindings());
})->get();
return $return;
我想加入这两个雄辩的问题。
我发现了这个问题。有什么建议?
答案 0 :(得分:0)
这主要是因为如果你做dd($ calendar),你会发现toSql()方法只是将查询转换为原始sql,没有参数。 $ id将是&#39;?&#39;最有可能的(正如你在错误的底线看到的那样)。这同样适用于温度
我建议不要转换为toSql(),除非你真的需要,你可以做一个单一的查询来获取你正在寻找的内容
答案 1 :(得分:0)
使用fromSub()
:
DB::query()->fromSub($temperature, 'temp')
在Laravel 5.6.17中,您可以使用rightJoinSub()
简化联接:
->rightJoinSub($calendar, 'cal', 'temp.date', 'cal.date')