<?php class Cat extends Eloquent { public function user() { return $this->belongsTo('User'); } } class User extends Eloquent { public function cats() { return $this->hasMany('Cat'); } }
Теперь:
$cats = Cat::with('user')->get();
Выполняет 2 запроса:
select * from `cats` select * from `users` where `users`.`id` in ('1', '2', 'x')
Почему он не может это сделать:
select * from cats inner join users on cats.user_id = users.id
Для тех, кто говорит, что в таблице есть оба столбца id, которые можно легко избежать с помощью псевдонимов:
select c.id as cats__id, c.name as cats__name, c.user_id as cats__user_id, b.id as users__id, b.name as users__name from cats c inner join users b on b.id = c.user_id
ОБНОВИТЬ
Кто-то отметил, что Eloquent не знает столбцов таблиц от моделей, но я думаю, они могли бы дать возможность определить их в модели, чтобы затем использовать псевдонимы и выполнять правильное объединение вместо дополнительного запроса.
Мое предположение заключается в том, что это позволяет загружать несколько разных отношений. Скажем, например, у нас также был стол для собак:
class User extends Eloquent { public function cats() { return $this->hasMany('Cat'); } public function dogs() { return $this->hasMany('Dog'); } }
Теперь мы хотим, чтобы они загружали их как с помощью User:
$users = User::with('cats','dogs')->get();
Нет объединения, которое могло бы объединить их в один запрос. Однако выполнение отдельного запроса для каждого элемента «с» действительно работает:
select * from `users` select * from `cats` where `user`.`id` in ('1', '2', 'x') select * from `dogs` where `user`.`id` in ('1', '2', 'x')
Таким образом, хотя эта методология может привести к дополнительному запросу в некоторых простых обстоятельствах, она обеспечивает возможность загружать более сложные данные, когда метод соединения будет терпеть неудачу.
Это мое предположение, почему это так.
cats
и users
как правило, имеют столбец с именем id
, оставляя ваш предложенный запрос неоднозначным. Желаемая загрузка Laravel использует дополнительный запрос, но позволяет избежать этого потенциального неудачи.