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

时间:2013-11-26 11:34:11

标签: laravel-4

我有产品和库存表;

产品

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,如何通过stock的created_at订购,我尝试了两种方法,但它不起作用

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

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

3 个答案:

答案 0 :(得分:6)

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

(此答案基于this one。)

@IBAction func dismissKeyboardButton(sender: AnyObject) {
    view.endEditing(true)
}

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

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

答案 1 :(得分:1)

在Laravel中查询急切加载的关系时,无法应用订单。您可以在执行查询后订购集合。

$products = Product::with(array('validStock'))
    ->get()
    ->each(function ($product)
    {
        $product->validStock = $product->validStock
            ->sortBy(function ($validStock)
            {
                return $validStock->created_at;
            })
            ->reverse();
    });

答案 2 :(得分:0)

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

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