У меня есть таблица ресурсов и таблица resources_votes, в которой у меня есть запись о каждом случае, когда пользователь любит [voice_id 1] или не любит [voice_id 2] ресурс. Теперь мне нужно получить всю информацию о ресурсах, упорядоченную от наиболее понравившейся к менее подходящей, и так как у ресурса есть много resources_votes, когда я использую ->with('votes'), он возвращает массив объектов, каждая из которых resources_votes связана с идентификатором ресурса.

Есть ли способ подсчитать, сколько положительных голосов у ресурса [vote_id =2], добавить поле с таким количеством и упорядочить запрос от большинства проголосовавших к менее проголосовавшим?

PD: это пример объекта ресурса с отношением resources_votes, там вы можете увидеть массив голосов и идентификатор голосования, который мне нужно посчитать и упорядочить в соответствии с:

    {
            "id": 2,
            "name": "aspernatur",
            "image": "http://lorempixel.com/480/480/?31738",
            "author": "Max Thiel",
            "created_by": 6,
            "reviewed_by": "Mr. Emiliano Frami",
            "lang_id": 2,
            "resource_type_id": 1,
            "status": "Borrado",
            "resource_type": "Imagen",
            "platforms": [],
            "classifications": [],
            "votes": [
              {
                "id": 2,
                "user_id": 2,
                "resource_id": 2,
                "vote_id": 1
              },
              {
                "id": 29,
                "user_id": 1,
                "resource_id": 2,
                "vote_id": 2
              },
              {
                "id": 24,
                "user_id": 12,
                "resource_id": 2,
                "vote_id": 1
              },
            ]
          },
0
Miguelopezv 4 Апр 2017 в 03:00

2 ответа

Лучший ответ

Вы можете получить это с нетерпением загрузки, как это

$resources = Resource::withCount(['votes' => function ($query) {
    $query->where('vote_id', '=', '2'); //count positive votes only
}])->get();

Это вернет столбец с именем votes_count. Вам нужно вызвать этот столбец для отображения количества.

2
EddyTheDove 4 Апр 2017 в 05:08

Вы можете использовать Eloquent Accessors.

Создайте следующее пользовательское поле и функцию внутри вашей модели

protected $appends = ['positiveVotesCounter'];

Затем создайте следующую функцию для получения пользовательских данных.

function getPositiveVotesCounterAttribute() {
    $totalPositiveVotes = 0;
    foreach($this->votes as $vote) {
        if($vote['id'] == 2) {
            $totalPositiveVotes++;
        }
    }

    return $totalPositiveVotes;
}

Более подробную информацию можно найти здесь: https://laravel.com/docs/5.4/eloquent-mutators

Удачи!

0
Carlos González 4 Апр 2017 в 01:52