【问题标题】:Listing a User's Products by Category in Eloquent在 Eloquent 中按类别列出用户的产品
【发布时间】:2015-04-09 18:36:58
【问题描述】:

基本上我有以下表格,我正在尝试按类别为给定用户列出他的所有产品。

例子:

{
 user_id: 1
 username: xpto
   categories: [{
      id: 1
      name: category_1
        products: [{
          id: 3
          name: prod1
        },
        {
          id: 3
          name: prod1
        }],
      id: 2
      name: category_2
        products: [{
          id: 6
          name: prod5
        }],
    }]
}

我从我想要的结果中得到的最接近的是这个查询: App\User::with('products.category')->find(1);

已经花了很多时间思考这个问题,但毫无头绪,开始感到绝望。请帮忙。

【问题讨论】:

  • 究竟是什么不工作?您提供的查询 (App\User) 是否返回数据?
  • @Dave 它返回数据,但不返回我想要的数据(以及我想要的格式)。所以基本上我不知道如何编写查询。

标签: mysql sql laravel laravel-4 eloquent


【解决方案1】:

Eloquent 不使用带有连接的单个查询来返回数据,因此当您需要过滤相关表时,它是一个糟糕的选择。你雄辩的呼唤:

App\User::with('products.category')->find(1);

...实际上执行了几个查询。

SELECT * FROM users WHERE id = 1

SELECT * FROM products JOIN product_user ... WHERE user_id = 1

SELECT * FROM categories WHERE id IN (...all of the category_ids returned from products...)

您应该立即看到问题:Eloquent 首先查询所有用户并将它们存储在一个数组中,然后使用单独的查询来获取产品和类别。因此,您不能按类别对用户进行排序。

有两种方法可以解决这个问题:

  1. 使用 Eloquent 获取具有产品和类别的用户(如您提供的示例中所示),然后迭代结果并提取(和排序)类别和产品。
  2. 使用连接构造一个合适的查询。

    User::select('users.name as user_name', 'products.name as product_name', 'categories.name as category_name')
            ->join('product_user', 'users.id', '=', 'product_user.user_id')
            ->join('products', 'product_user.product_id', '=', 'products.id')
            ->join('categories', 'products.category_id', '=', 'categories.id')
            ->orderBy('categories.name')
            ->get();
    

请注意,如果您的表共享 id、name 等列名,则需要指定列别名。

【讨论】:

  • 感谢您的洞察力。将在你的例子上工作以获得我正在寻找的东西(非常接近):)
猜你喜欢
  • 2010-11-21
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2012-09-15
  • 2018-06-10
  • 1970-01-01
  • 2012-11-03
相关资源
最近更新 更多