我如何才能计数具有相同外键的项目并仍能获得关系数据?
我正在使用 PHP - Laravel -口才,并且具有三个表:User
,User_items
和items
。
User_items
具有三列:id
,user_id
和item_id
:
ID | user_id | item_id
0 | 5 | 2
1 | 5 | 3
2 | 5 | 8
3 | 5 | 3
假设items
也有三列:id
,name
和value
:
ID | Name | Value
2 | Sword | 500
3 | Pickaxe | 250
8 | Shovel | 700
我想对具有相同user_id
的项目进行计数,并从items
表返回项目数据。为了获取所有用户项,我使用以下关系:
public function user_items()
{
return $this->hasMany(User_items::class, 'user_id', 'id');
}
接下来,我想获取这些项目的名称并计数。我不只是想要:
Sword
Pickaxe
Shovel
Pickaxe
我想以某种方式获得这样的结果:
2 Pickaxe
1 Sword
1 Shovel
我的user_items
关系,以获取有关某项的数据,如下所示:
public function item_data()
{
return $this->hasOne(Items::class, 'id', 'item_id');
}
这就是我得到可重复结果的方式:
return response()->json(["DATA" => $user->user_items->load('item_data')->toArray()], 201);
示例输出
"DATA":[
{
"id":1,
"item_id":5,
"created_at":"2019-06-04 08:44:08",
"updated_at":"2019-06-04 08:44:08",
"item_data":{
"id":5,
"name":"Sword",
"rarity":"good",
"value":500,
"image":"image.jpg",
"color":"#3160ed",
"created_at":null,
"updated_at":null
}
},
}
我想在上面的输出中添加"count": 5
之类的行。
答案 0 :(得分:1)
我认为您需要的是用户与商品之间的多对多关系。
我将这样的表重命名以获得更好的命名约定:users,user_item,item。
class User
{
public function items()
{
return $this->belongsToMany(Item::class)
}
}
为每个用户返回项目和每个项目的数量。您可能会做类似的事情。
$items = $user->items()->select('items.*', 'count(items.id) AS items_count')
->groupBy('items.id')
->get()
->toArray();
// From the controller, this array will be automatically converted to json.
return ['DATA' => $items];
您将拥有类似的东西。并非完全符合您想要的格式,但我认为最好保持这种格式。
[
'DATA' => [
{
"id":5,
"name":"Sword",
"rarity":"good",
"value":500,
"image":"image.jpg",
"color":"#3160ed",
"created_at":null,
"updated_at":null,
items_count: 1
}
]
]