Laravel — закрытие соединения не работает со ссылкой на таблицу

Я застрял в запросе 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)
}
}

2

Решение

Ваше закрытие присоединения требует либо 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 используется только для значений, переданных в запрос.

3

Другие решения

В whereLaravel рассматривает последний аргумент как буквальную строку, а не как ссылку на таблицу. Таким образом, последний запрос пытается соответствовать 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'))
;
0

По вопросам рекламы [email protected]