如何计算重复外键的项目?

时间:2019-06-04 13:59:43

标签: php laravel eloquent

我如何才能计数具有相同外键的项目并仍能获得关系数据?

我正在使用 PHP - Laravel -口才,并且具有三个表:UserUser_itemsitems

User_items具有三列:iduser_iditem_id

ID | user_id | item_id
0  | 5       | 2  
1  | 5       | 3  
2  | 5       | 8  
3  | 5       | 3  

假设items也有三列:idnamevalue

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之类的行。

1 个答案:

答案 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
        }
    ]
]