Как написать запрос laravel с левым соединением и внутренним соединением?

У меня есть следующие таблицы, и я хочу выполнить левое соединение с условием и другим внутренним соединением из левой объединенной таблицы,

Пользовательская таблица

  
id  |  name  
 1     john  
 2     sam  
 3     cecil 

Таблица ролей

  
id | name  
 1  admin  
 2  editor 

таблица model_has_roles

role_id  | model_type | model_id
  1         App\User       1
  2         App\User       2

Что я хочу

Выполните левое соединение между пользовательской таблицей и таблицей model_has_roles в столбцах user.id и model_has_roles.model_id, если model_type — «Приложение\Пользователь», а затем еще одно внутреннее соединение между таблицей ролей и таблицей model_has_roles для столбцов role_id и Roles.id. Таким образом, результат должен быть таким,


id | name | role

 1   john   admin
 2   sam    editor
 3   cecil   -

Я пробовал следующий запрос, но не работал правильно,

 DB::table('users')->select('id', 'name', 'email', 'created_at', 'role_id')
            ->leftJoin('model_has_roles', 'model_has_roles.model_id', '=', 'users.id')
            ->where('model_has_roles.model_type', '=', 'App\User')
            ->paginate(1);

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

Спасибо

PS: На самом деле, я использую spatie/laravel-permission и пытаюсь получить всех пользователей с их именем роли.

Почему вы не используете их встроенные функции, такие как $user->getPermissionsViaRoles();?

Iftikhar uddin 23.01.2019 17:55

Что произойдет, если у меня будет около 50 пользователей и я захочу вызвать этот метод 50 раз при перечислении всех пользователей? Приведет ли это к снижению производительности? Это то, о чем я думал

Sameera Kumarasingha 23.01.2019 18:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
830
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это должно работать нормально:

App\User::with('roles')->get();

Да ты меня спас!! Это сработало для меня, $roles = Role::all(); $users = User::with('roles')->paginate(1);

Sameera Kumarasingha 24.01.2019 04:38

Другие вопросы по теме