Как выбрать последние записи каждого значения с помощью Eloquent? - PullRequest
0 голосов
/ 09 апреля 2019

Как выбрать последний из каждого option_id user_id?

+-----+-----------+---------+-------+
| id  | option_id | user_id | value |
+-----+-----------+---------+-------+
| 241 |         6 |       2 |     2 |
| 240 |         5 |       2 |     1 |
|  90 |         5 |       2 |    15 |
|  75 |         4 |       2 |    11 |
|  76 |         4 |       2 |     1 |
|  77 |         4 |       2 |     2 |
|  72 |         4 |       1 |    10 |
|  71 |         4 |       1 |    15 |
|  70 |         5 |       1 |     2 |
+-----+-----------+---------+-------+

Как написать запрос, используя Eloquent, чтобы получить только самый последний из каждого option_id данного user_id?

ДляВ представленной таблице выводом для user_id 2 должны быть записи id: 241,240,75.

Для записей user_id 1: 72, 70

РЕДАКТИРОВАТЬ:

Просто повторноитерации, я хотел бы вернуть коллекцию последних option_id для данного user_id.

Поэтому для user_id 2 будет 3 записи:

  • идентификатор записи 241, в которой хранятся последниезначение для option_id 6
  • идентификатор записи 240, который содержит самое последнее значение для option_id 5
  • идентификатор записи 75, который содержит последнее значение для option_id 4

для user_id 1будет только 2 записи:

  • идентификатор записи 72, который содержит самое последнее значение для option_id 4
  • идентификатор записи 70, который содержит последнее значение для option_id 5

Ответы [ 3 ]

0 голосов
/ 09 апреля 2019

Если ваша таблица называется user_options, вот Eloquent запрос для выбора записей, которые вы ищете.

        $getValues = DB::table('user_options')
        ->join(DB::raw('(SELECT max(user_options.id) FROM user_options INNER JOIN (
                        SELECT option_id, user_id FROM user_options GROUP BY option_id, user_id) sets
                        WHERE user_options.option_id = sets.option_id AND user_options.user_id = sets.user_id
                        GROUP BY user_options.option_id, user_options.user_id
            ) valuerecords'),
        function($join)
        {
           $join->on('user_options.id', '=', 'valuerecords.id');
        })->select(
            'id',
            'option_id',
            'user_id',
            'value'
        )->get();

Необработанный запрос select получает идентификаторы последних записей, а затем он объединяетсявернуться к столу, чтобы взять записи.

Обратите внимание, что «последняя» запись - это запись с наибольшим идентификатором, поэтому она будет захватывать запись 77, а не 75. Если вы определяете последнее по-другому, вы можете соответствующим образом изменить необработанный запрос.

0 голосов
/ 11 апреля 2019

Оказывается, это было так же просто, как:

      $options= DB::table('options')
            ->where('user_id', Auth::getUser()->id)
            ->groupBy("option_id")
            ->orderBy("option_id", "DESC")
            ->get();

Но для этого запроса пришлось установить для строгого режима значение false и вернуть его в значение true после получения данных.

Перед запросом:


        // turn off strict mode for the below query
        config()->set('database.connections.mysql.strict', false);
        \DB::reconnect(); //important as the existing connection if any would be in strict mode

и после запроса:

        //now changing back the strict ON
        config()->set('database.connections.mysql.strict', true);
        \DB::reconnect();
0 голосов
/ 09 апреля 2019

Предполагая, что таблица является пользователем, и учитывая, что $id является динамическим. Может быть, это то, что вы имеете в виду:

$user = User::where('user_id', $id) 
            ->orderBy('id', 'DESC') 
            ->get();

И, наконец, используйте этот код $user->unique('option_id'), чтобы получить реальный результат.


Надеюсь, это поможет:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...