如何通过Laravel中的热切加载来另一个表加入

Cha*_*han 3 laravel-4

我有产品和库存表;

制品

id int
name varchar
created_at timestamp
Run Code Online (Sandbox Code Playgroud)

个股

id int
name varchar
product_id varchar
created_at timestamp
Run Code Online (Sandbox Code Playgroud)

产品型号

public function validStock() {
    return $this->hasMany('Stock')->where('quantity', '>', 10);
}
Run Code Online (Sandbox Code Playgroud)

如果两者都有created_at,如何通过stock的created_at订购,我尝试了两种方法,但它不起作用

Product::with('validStock')->orderBy('validStock.created_at', 'DESC');

Product::with(array('validStock' => function($q) {
    $q->orderBy('created_at', 'DESC');
}));
Run Code Online (Sandbox Code Playgroud)

tre*_*mby 8

在检索所有数据之后进行排序(在分页结果时无法以有效的方式进行排序),您可以使用连接.

(这个答案是基于这个.)

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();
Run Code Online (Sandbox Code Playgroud)

我唯一不喜欢的是它带走了一些数据库抽象,因为你必须在这里编写你的表名.

请注意,我没有尝试过这个方向的hasMany关系,因为你在你的例子中有它(选择产品,每个产品都有很多股票).我只尝试过另一个方向的hasMany(例如选择股票,每个股票只有一个产品).


Rob*_*ijn 1

您应该在闭包中返回 $q :

Product::with(array('validStock' => function($q) {
    return $q->orderBy('created_at', 'DESC');
}));
Run Code Online (Sandbox Code Playgroud)