Я пытался найти его надолго, и я не могу поверить, что Laravel не обладает этой функциональностью.
Итак, я могу написать:
select * from a join b where a.id = b.id
или более красивым:
select * from a join b using(id)
Первый случай для Laravel прост:
$query->leftJoin('b', 'a.id', '=', 'b.id')
Но как написать второй случай? Я ожидаю, что он будет простым и коротким, например:
$query->joinUsing('b', 'id')
Но такого метода нет, и я не могу его найти.
PS: возможно, что ответ очень прост, его сложно найти по слову «используя», потому что он повсюду.
ОБНОВИТЬ
Я пойду глубже в источник, пытаясь сделать область или передать функцию, чтобы присоединиться, но даже внутри этой функции я ничего не могу с этим $ query. Пример:
public function scopeJoinUsing($query, $table, $field) { sql($query->join(\DB::raw("USING(`{$field}`)"))); // return // inner join `b` on USING(`id`) `` // yes, with "on" and with empty quotes sql($query->addSelect(\DB::raw("USING(`{$field}`)"))); // return // inner join `b` USING(`id`) // but in fields place, before "FROM", which is very logic :) }
Поэтому, даже если забыть о сфере видимости, я не могу это сделать в DB :: raw (), поэтому это невозможно … В первый раз я вижу в Laravel что-то невозможное.
Итак, ответ – это невозможно.
Laravel не поддерживает эту функциональность, что очень грустно.
Я исправлю это в исходном коде Laravel, мой PULL REQUEST здесь – https://github.com/laravel/framework/pull/12773