首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Laravel中用另一张表连接急装货

如何在Laravel中用另一张表连接急装货
EN

Stack Overflow用户
提问于 2013-11-26 11:34:10
回答 3查看 12.1K关注 0票数 5

我有产品和库存表;

产品

代码语言:javascript
复制
id int
name varchar
created_at timestamp

股票

代码语言:javascript
复制
id int
name varchar
product_id varchar
created_at timestamp

产品模型

代码语言:javascript
复制
public function validStock() {
    return $this->hasMany('Stock')->where('quantity', '>', 10);
}

如果两者都有created_at,如何按股票的created_at订购,我已经尝试了两种方法,但这是行不通的

代码语言:javascript
复制
Product::with('validStock')->orderBy('validStock.created_at', 'DESC');

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

回答 3

Stack Overflow用户

发布于 2015-08-24 21:49:36

您可以使用联接,而不是在检索所有数据后进行排序(在对结果进行分页时不可能高效地进行排序)。

(这个答案基于this one。)

代码语言:javascript
复制
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的另一个方向(例如选择股票,每种股票都有一个产品)。

票数 12
EN

Stack Overflow用户

发布于 2013-11-26 14:01:26

在Laravel查询热切加载的关系时,您不能申请订单。在执行查询后,可以对集合进行排序。

代码语言:javascript
复制
$products = Product::with(array('validStock'))
    ->get()
    ->each(function ($product)
    {
        $product->validStock = $product->validStock
            ->sortBy(function ($validStock)
            {
                return $validStock->created_at;
            })
            ->reverse();
    });
票数 1
EN

Stack Overflow用户

发布于 2013-11-26 12:45:22

应该在闭包中返回$q:

代码语言:javascript
复制
Product::with(array('validStock' => function($q) {
    return $q->orderBy('created_at', 'DESC');
}));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20215967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档