我有产品和库存表;
产品
id int
name varchar
created_at timestamp股票
id int
name varchar
product_id varchar
created_at timestamp产品模型
public function validStock() {
return $this->hasMany('Stock')->where('quantity', '>', 10);
}如果两者都有created_at,如何按股票的created_at订购,我已经尝试了两种方法,但这是行不通的
Product::with('validStock')->orderBy('validStock.created_at', 'DESC');
Product::with(array('validStock' => function($q) {
$q->orderBy('created_at', 'DESC');
}));发布于 2015-08-24 21:49:36
您可以使用联接,而不是在检索所有数据后进行排序(在对结果进行分页时不可能高效地进行排序)。
(这个答案基于this one。)
Product::with('validStock')
->join('stocks', 'stocks.product_id', '=', 'products.id')
->select('products.*') // Avoid selecting everything from the stocks table
->orderBy('stocks.created_at', 'DESC')
->get();我唯一不喜欢的地方是,它带走了一些数据库抽象,因为您必须在这里写表名。
注意,我还没有在这个方向上尝试过hasMany关系,就像在示例中一样(选择产品,每个产品都有很多库存)。我只试着用hasMany的另一个方向(例如选择股票,每种股票都有一个产品)。
发布于 2013-11-26 14:01:26
在Laravel查询热切加载的关系时,您不能申请订单。在执行查询后,可以对集合进行排序。
$products = Product::with(array('validStock'))
->get()
->each(function ($product)
{
$product->validStock = $product->validStock
->sortBy(function ($validStock)
{
return $validStock->created_at;
})
->reverse();
});发布于 2013-11-26 12:45:22
应该在闭包中返回$q:
Product::with(array('validStock' => function($q) {
return $q->orderBy('created_at', 'DESC');
}));https://stackoverflow.com/questions/20215967
复制相似问题