Как считать предметы, где внешний ключ повторяется? - PullRequest
0 голосов
/ 04 июня 2019

Как я могу считать элементы с тем же внешним ключом и при этом получать доступ к данным отношений?

Я использую PHP - Laravel - Eloquent и имеет три таблицы: 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 к вышеприведенному выводу.

1 Ответ

1 голос
/ 05 июня 2019

Я считаю, что вам нужно, чтобы между пользователем и элементом были отношения «многие ко многим».

Я переименовываю таблицы следующим образом для лучшего соглашения об именах: users, user_item, items.

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
        }
    ]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...