Php 口若悬河

Php 口若悬河,php,laravel-4,eloquent,Php,Laravel 4,Eloquent,我有一个表客户和一个表订单。一个客户可以有多个订单。 我试图提出一个查询,为每个客户获取第一个和最后一个订单 $customers = Customer::with(array('orders' => function($query) { $query->orderBy('id','desc'); })) ->with(array('orders' => function($query) { $query->orderBy('id', 'asc')

我有一个表
客户
和一个表
订单
。一个客户可以有多个订单。 我试图提出一个查询,为每个客户获取第一个和最后一个订单

$customers = Customer::with(array('orders' => function($query)
{
    $query->orderBy('id','desc');

}))
->with(array('orders' => function($query)
{
    $query->orderBy('id', 'asc');

}))
->get();
我的查询如下所示,使用急切加载,但我只能为每个客户获取两个订单中的任何一个

$customers = Customer::with(array('orders' => function($query)
{
    $query->orderBy('id','desc');

}))
->with(array('orders' => function($query)
{
    $query->orderBy('id', 'asc');

}))
->get();

您知道如何以雄辩的方式进行吗?

您需要为此指定单独的“助手”关系:

// Suppose it's Use hasMany Order relation and
public function latestOrder()
{
  return $this->hasOne('Order')->orderBy('id', 'desc'); // or instead of orderBy you can use latest() which orders by created_at
}

public function oldestOrder()
{
  return $this->hasOne('Order')->orderBy('id', 'asc'); // orderBy here may be omitted, it's just for clarity
}
然后像这样加载它:

$customers = Customer::with('latestOrder', 'oldestOrder')->get();
旁注

不要将这些关系与真实的
订单
关系一起使用,因为这会浪费两个查询。如果是这种情况,请使用
Collection
方法
$customer->orders->first()
last()