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

如何按laravel中的关系实体分组

姬飞飙
2023-03-14

我有2个模型订单和城市代码,每个订单都有一个城市代码,现在我想做的是向用户显示他每个城市有多少订单例如,会有下面这样的事情:

Illuminate\Support\Collection {#2220 ▼
  #items: array:17 [▼
    "new-york" => 80
    "city-number2" => 20
    "city-number3" => 10
    "city-number4" => 5
  ]
}

到目前为止,我尝试的是按如下顺序使用laravelswith count

        $orders = Order::withCount('orders')->where('shop_id', $shop->id)->get();

但是没有运气,因为它返回所有城市的计数,而不是每个城市的计数。提前感谢

共有3个答案

年良骏
2023-03-14

控制器要找到每个城市有多少订单,请使用类似于laravel Elotent的查询。

$orders = Order::with('cities')
    ->select('city_id',\DB::raw('count(*) as city'))
    ->groupby('city_id')
    ->get();
酆景辉
2023-03-14

这个问题基于DBMS中的一对多关系,在laravel中,eloqut附带了一个内置选项(一个城市有多个订单,一个订单属于一个城市)。首先,您需要实现城市模型和城市内订单模型定义这样的函数

 public function orders()
    {
        return $this->belongsTo(Order::class, 'city_id');
    }

为了让模型定义这样一个函数

  public function city()
    {
        return $this->hasMany(City::class, 'order_id');
    }

然后在控制器中找到每个城市有多少订单使用这样的查询与laravel雄辩

$cities= City::withCount(['orders' => fn ($q) => $q->where('shop_id', $shop->id)])->get();
foreach ($cities as $city) {
    echo $city->orders_count;
}

withCount方法将在结果模型上放置{relation}\u count属性:

能修谨
2023-03-14

您可以轻松地从另一个方向执行此查询:

$cities = City::withCount(['orders' => fn ($q) => $q->where('shop_id', $shop->id)])->get();

foreach ($cities as $city) {
    echo "{$city->name}: {$city->orders_count}";
}

如果你需要限制哪些城市被列出,你可以在需要的时候进一步限制。

 类似资料:
  • 两个表格: 实体类(基本结构): SQL查询和结果: JPQL查询: *我知道我在上面给定的结构中没有它,但我想知道如何正确操作。我该如何从“ManyToOne”、“OneToOne”等选项中进行选择。 如何修改实体类和JPQL查询以获得与SQL查询相同的结果?我一直在尝试各种各样的事情,但都不管用。它不允许我创建两个具有相同列名的字段,也不允许我将字符串定义为@JoinColumn。我几乎成功了

  • 我有3个表:,和,这是其他2之间的枢轴。我需要做的是按表中的位置排序。 我尝试在中的关系中排序,或者在将一起使用时排序,但我可能做错了。前任: 有人能给出一个排序两级嵌套关系的基本示例吗? 编辑:我不需要按基表中的任何列排序,而是按第二个表中的列排序数据透视表中的条目列表。 编辑2: 举例说明如何对输出进行排序:

  • 问题内容: 我有一对多关系中的两个客户实体和订单实体。对于每个客户,我需要计算关联订单的数量,并按此数量对结果进行排序。在本地postgres查询中,它看起来像这样: 但是我必须使用CriteriaBuilder来执行此操作,因为此查询是使用CriteriaBuilder放入其他条件的较大代码段的一部分。在Hibernate中,我可能会使用Projections,但在JPA中找不到类似的东西。 使

  • 我有两张一对一的表: 用户: 用户数 我的实体: 使用者 用户账户 我试图坚持这一点,但我有错误: 当我尝试坚持我得到这个错误: 严重:Servlet。路径为[/ibank]的上下文中servlet[appServlet]的服务()引发了异常[Request processing failed;嵌套异常为javax.persistence.PersistenceException:org.hibe

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

  • 本章将向您介绍实体之间的关系。 通常,关系在数据库中的表之间更有效。 这里实体类被视为关系表(JPA的概念),因此实体类之间的关系如下: @ManyToOne关系 @OneToMany关系 @OneToOne关系 @ManyToMany关系 @ManyToOne关系 实体之间的多对一关系:其中一个实体(列或列集)被包含唯一值的另一个实体(列或列集)引用。 在关系数据库中,通过在表之间使用外键/主键