Php 拉威尔急加载问题

Php 拉威尔急加载问题,php,mysql,laravel,laravel-4,eager-loading,Php,Mysql,Laravel,Laravel 4,Eager Loading,假设我有一个订单表、一个用户表和一个来宾表,用于同时接受用户和来宾订单的公司 订单表上还有一个is_guest布尔值,可以让我快速知道订单是由客户还是注册用户下的 我有一个名为customer的模型方法,它返回如下所示的雄辩关系: public function customer() { return $this->is_guest ? $this->belongsTo('Guest', 'user_id') : $this->belongsTo('User', 'user

假设我有一个订单表、一个用户表和一个来宾表,用于同时接受用户和来宾订单的公司

订单表上还有一个is_guest布尔值,可以让我快速知道订单是由客户还是注册用户下的

我有一个名为customer的模型方法,它返回如下所示的雄辩关系:

public function customer()
{
  return $this->is_guest ? $this->belongsTo('Guest', 'user_id') : $this->belongsTo('User', 'user_id');
}
当我将订单传递给视图并访问客户的数据时,这种方法非常有效,如下所示:

// Maps to either $order->user->firstname OR $order->guest->firstname
echo $order->customer->firstname;
但是,当我尝试在使用“渴望加载”时使用此功能时,它并不完全起作用:

$orders = Order::with('customer')->get();
return Response::make($orders);
它只返回用户或来宾的已加载客户数据,而不会同时返回这两个数据

我想知道为什么会这样,以及如何绕过它

这是不是因为急切加载的工作方式——它只调用customer方法一次,就像它只访问数据库一次一样,所以无论查询的第一个结果是什么,它也将使用它来确定查询的其余部分

如果我试图获得所有订单数据的JSON响应以及客户的所有详细信息,我将如何做到这一点

谢谢

使现代化 是的,原来我是在滥用拉威尔关系法,增加了一个条件。 正如@lukasgeiter所建议的,使用多态关系是一种更好的方法。

我确实很难加载基于多态关系的其他关系。例如,如果User和Guest都有相应的表UserDetail和GuestDetail,那么我就无法让急切的加载工作。因此,我在用户模型和来宾模型中都添加了以下内容:

这意味着,每当客户多态关系被急切加载时,用户和客户都将自动加载他们的关系。我想我也可以使用'lazy loading'功能$order->load'customer',但我没有尝试

public function detail()
{
    return $this->hasOne('UserDetail');
}

谢谢大家。

它将使用第一次在页面上调用的结果是。我还认为,在关系中使用条件并不是Taylor想要的:PYou可能想要查看此来宾/用户设置感谢您提供的信息-是的,我确实认为这有点像黑客,但在我看来效果很好:这是数据库结构的常见问题吗?我应该改为订客人和订用户透视表吗?谢谢@lukasgeiter-这似乎正是我想要的。希望我能做到这一点。首先,您需要使用模型的方法名而不是方法名来解析模型名。您希望加载的模型名称。
public function detail()
{
    return $this->hasOne('UserDetail');
}