Laravel Уведомление базы данных - группировка по идентификатору и типу сообщения - PullRequest
1 голос
/ 30 января 2020

Я не могу понять одну проблему с уведомлением базы данных в Laravel. Я sh, чтобы показать уведомления пользователей, как Facebook. Например: «Пользователь X, Y и еще 2 человека прокомментировали вашу фотографию». Моя структура базы данных выглядит следующим образом:

+--------------------------------------+------------------------------+-----------------+---------------+-----------------------------------------+---------+---------------------+---------------------+
|                  id                  |             type             | notifiable_type | notifiable_id |                        data             | read_at |     created_at      |     updated_at      |
+--------------------------------------+------------------------------+-----------------+---------------+-----------------------------------------+---------+---------------------+---------------------+
| 6d57d30c-419c-4f22-9aaa-f6bb22354887 | App\Notifications\NewComment | App\Models\User |             1 | {"userId":4,"commentId":42,"albumId":3} |         | 2020-01-29 18:00:10 | 2020-01-29 18:03:15 |
| 7d57d30c-419c-4f22-9aaa-f6bb22354887 | App\Notifications\NewComment | App\Models\User |             1 | {"userId":4,"commentId":42,"albumId":3} |         | 2020-01-29 18:00:15 | 2020-01-29 18:03:15 |
| 8d57d30c-419c-4f22-9aaa-f6bb22354887 | App\Notifications\NewComment | App\Models\User |             1 | {"userId":5,"commentId":42,"albumId":2} |         | 2020-01-29 18:03:15 | 2020-01-29 18:03:15 |
| 9d57d30c-419c-4f22-9aaa-f6bb22354887 | App\Notifications\NewComment | App\Models\User |             1 | {"userId":4,"commentId":42,"albumId":2} |         | 2020-01-29 18:02:15 | 2020-01-29 18:03:15 |
+--------------------------------------+------------------------------+-----------------+---------------+-----------------------------------------+---------+---------------------+---------------------+

Я не могу понять, как группировать по type и albumId (в столбце data). Можете ли вы мне помочь, пожалуйста? Я все еще перезаписываю метод пользовательской модели:

public function getNotificationsAttribute()
{
    $notifications = $this->notifications();
    $notifications->groupBy('type', 'data->albumId')->orderBy('created_at', 'desc')->get();
    return $notifications;
}

1 Ответ

1 голос
/ 31 января 2020

Было бы очень сложно сделать это с помощью построителя запросов (тем более, поскольку это не столбец JSON), но если вы работаете с коллекцией, groupBy() может принять обратный вызов функция , так что довольно просто сделать что-то вроде этого:

public function getNotificationsAttribute()
{
    return $this
        ->notifications()
        ->get()
        ->groupBy("type"),
        ->groupBy(function($data) {
            return $data["albumId"];
        })
        ->orderBy("created_at", "desc");
}

Это предполагает, что модель Eloquent настроена на приведение столбца в виде массива.

protected $casts = ["data" => "array"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...