【发布时间】:2014-07-18 04:52:42
【问题描述】:
<?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 不知道模型中表的列,但我想他们可以提供一种在模型中定义它们的方法,这样它就可以使用别名并进行适当的连接而不是额外的查询。
【问题讨论】:
-
@deczo Ahmmm... 因为它是 1 个查询而不是 2 个?
Cat上的user_id不可为空,每个Cat都属于User... 那么为什么不inner join? -
@deczo 同样,如果 ORM 设计人员 想要 解决它,这不是主要问题。对象的定义可以很容易区分“总是有”和“有时有”,或者检索“肯定有”和“可能有”,并适当地选择inner、left或right join。我不知道 Eloquent,所以也许他们只是决定让事情变得简单。
-
@deczo 我不认为我在关注你。 join 子句的存在是有原因的,因此您不必执行额外的查询来匹配来自不同表的行。如果你在谈论不同类型的连接,比如左、右、内......我想你可以根据模型中的关系告诉 Eloquent 使用哪一个。
belongsTo表示它始终属于,因此外键不能为空。他们可以添加另一个类似canBelongTo的内容,这将允许外键为空,因此它将使用左连接。不知道,只是说... -
事情是 ORM 只是让生活更轻松的另一层。它的主要目的是对开发人员友好,我认为这个尽可能简单。它有缺陷和限制,还有性能问题,代码中也存在不一致,但另一方面,它确实很有说服力,非常适合简单的任务。但是,没有足够灵活的 ORM 来满足所有要求,这就是为什么您(我)不将 ORM 用于更复杂的工作。
-
@emzero,我最近开始检查 laravel,我面临着完全相同的问题,我无法相信开发人员怎么能说额外的查询是可以的,join 可以完成工作和/或@ 987654333@还可以
标签: php join laravel-4 eloquent eager-loading