Почему Laravel / Eloquent не может использовать JOIN для Eager Loading?

<?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 использует дополнительный запрос, но позволяет избежать этого потенциального неудачи.