Laravel Eloquent: получите уникальные модели отношений - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть такой сценарий:

У меня есть User модель, которая имеет OneToMany отношения с Post моделью. У меня есть модель Hashtag, которая имеет отношения OneToMany с моделью Post.

Резюме: ONE пользователь имеет MANY сообщений, ONE сообщение принадлежит ONE хэштег, ONE хэштег имеет MANY сообщений.

Я хотел бы только получитьуникальные пользовательские записи хэштега.

Я могу сделать это не масштабируемым способом (сначала извлекая все сообщения, а затем повторять фильтрацию по идентификатору пользователя), но мне нужно поддерживать масштабируемость для больших номеров записей.

Редактировать: Я видел частичное решение в документах Laravel. У Laravel eloquent есть метод, называемый unique () .

. С помощью этого метода я могу указать параметр, который должен быть уникальным в запросе.

В моем случае это выяснилось с помощью:

$users = $hashtag->posts->unique('user_id');

Но я не могу разбить запрос на страницы таким образом ...

У кого-нибудь есть решение для этого?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2019

Вы должны разбить на страницы вызывающего абонента вашей основной модели.

Я не знаю точно, может ли это воспроизвести ваш реальный сценарий, но давайте посмотрим на этот пример:

Допустим, у вас естьмодель хэштеги

Итак, предположим, что код может выглядеть примерно так:

$users = DB::table('hashtags AS tags')
    ->select('tags.*')
    ->join('[posts AS post','post.id','=','tags.id')
    ->distinct()
    ->paginate(5, ['tags.*']);

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

Запоминание всегда красноречивого иногда, даже когда мы создаем запросы на соединение, может быть более дорогостоящим для вашей базы данных.

Поскольку вы беспокоитесь о масштабируемости, поэтому лучше всего было бы написать представление дляполучить все данные с правильной индексацией и секционированием.

0 голосов
/ 21 ноября 2019

Попробуйте использовать DISTINCT

$users = $hashtag->posts()->selectRaw('DISTINCT(user_id) AS unique_user_id')->paginate(10);

ИЛИ

используйте groupBy()

$users = $hashtag->posts()->groupBy('name')->select('user_id')->paginate(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...