在 Eloquent 中按类别列出用户的产品
Listing a User's Products by Category in Eloquent
基本上我有以下表格,我正在尝试按类别列出给定用户的所有产品。
示例:
{
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);
已经花了很多时间思考这个问题,但没有头绪,开始感到绝望。请帮忙
Eloquent 不使用连接到 return 数据的单个查询,因此当您需要过滤相关表时,这是一个糟糕的选择。您的 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 首先查询所有用户并将它们存储在一个数组中,然后使用单独的查询来获取产品和类别。因此您不能按类别对用户进行排序。
有两种方法可以解决这个问题:
- 使用 Eloquent 获取具有产品和类别的用户(如您提供的示例中所示),然后遍历结果并提取(排序)类别和产品。
使用连接构建正确的查询。
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、名称等),则需要指定列别名。
基本上我有以下表格,我正在尝试按类别列出给定用户的所有产品。
示例:
{
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);
已经花了很多时间思考这个问题,但没有头绪,开始感到绝望。请帮忙
Eloquent 不使用连接到 return 数据的单个查询,因此当您需要过滤相关表时,这是一个糟糕的选择。您的 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 首先查询所有用户并将它们存储在一个数组中,然后使用单独的查询来获取产品和类别。因此您不能按类别对用户进行排序。
有两种方法可以解决这个问题:
- 使用 Eloquent 获取具有产品和类别的用户(如您提供的示例中所示),然后遍历结果并提取(排序)类别和产品。
使用连接构建正确的查询。
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、名称等),则需要指定列别名。