当前位置: 首页 > 知识库问答 >
问题:

Laravel雄辩模型按局部列排序和关系模型列值排序

尉迟浩思
2023-03-14

我有两种型号:

  1. 产品,它有排序字段
  2. 库存,具有产品标识和数量字段

我想按排序字段(ASC)获取订购的产品,但库存量等于0的产品需要位于列表的末尾。

例如。

产品介绍

id     sort
1      3
2      4
3      2
4      1

股票

product_id    quantity
1             2
1             3
2             5
3             0
4             2

预期列表(产品ID)-4、1、2、3

我已经为我需要做的事情编写了SQL查询。

select p.url, p.sort, s.tot
from products p
inner join (select product_id, sum(quantity) as tot from stocks group by product_id) s on p.id = s.product_id
order by case when s.tot = 0 then 1 else 0 end, p.sort asc
php prettyprint-override">public function stocks() {
    return $this->hasMany('\App\Stock', 'product_id');
}

有没有一种方法可以使用雄辩模型的作用域来获得此类列表?

使现代化

解决方案。

public function scopeOrdered($query, $notInStock = false)
    {
        if($notInStock)
            return $query->join(DB::raw("(
                select product_id, sum(quantity) as tot
                from stocks
                group by product_id
                ) s"), 'products.id', '=', 's.product_id')->orderByRaw("case when s.tot = 0 then 1 else 0 end, products.sort ASC");
        else
            return $query->orderBy('sort', 'asc');
    }

共有1个答案

邴俊民
2023-03-14

您可以使用合并方法。但我认为您的数据库设计不正确。我认为最好在product表中添加quantity字段。若出于任何原因希望保留此设计,那个么可以在stocks表中为product_id设置唯一索引。例如,您的一个产品(id=1)现在有两个数量。这在现实世界中是不可能的

    $query1 = Product::whereHas('stocks' , function ($q) {
        $q->where('quantity', '<>',  0);
    })->with('stocks')->orderBy('sort','asc')->get();

    $query2 = Product::whereHas('stocks' , function ($q) {
        $q->where('quantity', 0);
    })->with('stocks')->get();


    $merged = $query1->merge($query2);

    return $merged;

您可以使用以下示例中的查询:

    $products = DB::table('products')
        ->join('stocks', 'stocks.product_id', '=', 'products.id')
        ->selectRaw(' product_id, sum(quantity) as tot')
        ->groupBy('product_id')
        ->orderByRaw(
            "CASE WHEN quantity = 0 THEN 1 ELSE 0 END ASC"
        )
        ->get();



    return $products;
 类似资料:
  • 问题内容: 我试图按表中的列对表中的产品进行排序: 我在商店\产品模型中设置关系: 但是产品没有分类。我得到一个仅适用于表的查询。 如何解决? 问题答案: 急切的加载使用单独的查询,因此您需要为此加入: 子句是为了不将联接的列追加到模型中。 编辑:根据@alexw注释-如果需要,您仍然可以包括联接表中的列。您可以将它们添加到或致电等。

  • 尝试先按最新日期,然后按状态订购我的表。状态可以是(新建、审核中、拒绝、关闭),状态是数据库中的枚举字段。 我试了几件事都没有成功。这是我对这个代码最接近的了。我是新来的Laravel,所以不知道如何做到这一点。 这就产生了: 我希望它看起来像这样,按日期排序,首先是最新的日期,然后是状态="New"。我希望它看起来像这样:

  • 因此,我在JeffreyWay的屏幕广播中了解到,我可以使用Eloquent从注入到另一个模型的模型中获取相关id。 我正在关注他关于Laravel 5.4的系列报道。 在这里,我有一个用户到帖子的一对多关系。 应用程序/帖子 在我的用户模型中,我有一个发布方法,其中注入了发布模型。发布方法用于创建进入数据库的发布条目。 应用/用户 然后,我在PostsController中有一个存储方法,它在我

  • 我正在尝试使用Laravel雄辩的模型查询多个表,这些模型具有一对一、一对多和多对多的关系。 我有一个表,一个表,一个表和一个透视表。 每个表单有一个品牌和一个用户: 品牌没有任何外键: 用户没有任何外键: 有一个数据透视表可以创建多对多的关系,用于创建拥有许多用户(如品牌成员)的品牌组: 我试图通过直接所有权()或品牌成员身份获取属于用户的所有表单,通过多对多透视表获取用户所属的所有品牌的所有表

  • 简介: 我有这些表与他们的模型: 地址表-- 规则: 每个用户只能有一个地址 这里可以进行两种可能的关系规划: > 用户有一个地址和地址属性To User[即一对一关系],但缺点是外键位于地址表中,即user_id字段,通过与其他模型[公司和财产]重复相同的关系,我们将获得地址表中的另外两个外键是[company_id和property_id],那么我们将最终得到3个外键用于3个型号,但每行记录只

  • 我将有一个充满涉及其他表(关系)的信息的表。此表中的大多数信息将只有引用相关表的ID。如果我使用“产品”作为此表的示例,对于某些列来说可能是这样的: 我想把这个“产品”表倒出到一个列表中。当我将其转储(关系)时,我需要查找这些列中的所有项。我知道如何做物品和物品,但是我不确定如果我有一个“产品”模型,我怎么能用雄辩的模型一次性做到这一点?我应该让产品表只是一个数据透视表吗?我可以用雄辩的模型做它,