Я застрял в запросе MySQL присоединиться.
В настоящее время у меня есть следующее:
$query = DB::table('packages')
->join('assigned_packages', function($join) use($id)
{
$join->on('packages.id', '=', 'assigned_packages.registered_package_id')
->where('assigned_packages.customer_id', '=', $id);
})
->join('registered_packages', function($join)
{
$join->on('packages.id', '=', 'registered_packages.id')
->where('registered_packages.id', '=', 1);
});
Это прекрасно работает, но, как вы можете видеть, у меня есть жестко закодированный 1:
->where('registered_packages.id', '=', 1);
это 1 следует заменить на значение из таблицы assigned_packages и колонна registered_package_id. Я старался
$query = DB::table('packages')
->join('assigned_packages', function($join) use($id)
{
$join->on('packages.id', '=', 'assigned_packages.registered_package_id')
->where('assigned_packages.customer_id', '=', $id);
})
->join('registered_packages', function($join)
{
$join->on('packages.id', '=', 'registered_packages.id')
->where('registered_packages.id', '=', 'assigned_packages.registered_package_id');
});
Но это не работает. Что я делаю неправильно? Я думаю, мне нужен результат первого соединения для второго. Но как я могу это сделать?
dd(DB::getQueryLog());
выходы:
array(2) {
[0]=>
array(3) {
["query"]=>
string(48) "select * from `customers` where `id` = ? limit 1"["bindings"]=>
array(1) {
[0]=>
string(2) "45"}
["time"]=>
float(0.65)
}
[1]=>
array(3) {
["query"]=>
string(278) "select * from `packages` inner join `assigned_packages` on `packages`.`id` = `assigned_packages`.`registered_package_id` and `assigned_packages`.`customer_id` = ? inner join `registered_packages` on `packages`.`id` = `registered_packages`.`id` and `registered_packages`.`id` = ?"["bindings"]=>
array(2) {
[0]=>
string(2) "45"[1]=>
string(39) "assigned_packages.registered_package_id"}
["time"]=>
float(0.9)
}
}
Ваше закрытие присоединения требует либо DB::raw
как предложено, или метод, который предназначен для этого on
:
->join('registered_packages', function($join)
{
$join->on('packages.id', '=', 'registered_packages.id')
->on('registered_packages.id', '=', 'assigned_packages.registered_package_id');
});
where
on joins используется только для значений, переданных в запрос.
В where
Laravel рассматривает последний аргумент как буквальную строку, а не как ссылку на таблицу. Таким образом, последний запрос пытается соответствовать registered_packages.id
столбец против буквальной строки «Assigned_packages.registered_package_id».
Использовать where
со ссылкой на таблицу, вы должны указать Laravel «делать так, как вы хотите», используя DB::raw
:
$join->
on('packages.id', '=', 'registered_packages.id')->
where('registered_packages.id', '=', \DB::raw('assigned_packages.registered_package_id'))
;