Я использую стандартную структуру таблицы Entrust:
таблица разрешений:
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | UNI | NULL | |
| display_name | varchar(255) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| created_at | timestamp | NO | | NULL | |
| updated_at | timestamp | NO | | NULL | |
+--------------+------------------+------+-----+---------+----------------+
Таблица разрешения_ролей:
+---------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+-------+
| permission_id | int(10) unsigned | NO | PRI | NULL | |
| role_id | int(10) unsigned | NO | PRI | NULL | |
+---------------+------------------+------+-----+---------+-------+
таблица ролей:
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | UNI | NULL | |
| display_name | varchar(255) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| created_at | timestamp | NO | | NULL | |
| updated_at | timestamp | NO | | NULL | |
+--------------+------------------+------+-----+---------+----------------+
Теперь, учитывая role_id, я хотел бы выбрать следующее из этой базы данных:
permissions.id
permissions.display_name
permission_role
таблица содержит запись с permission_id
и данный role_id
Последний оказался немного хитрым в Eloquent.
Этот SQL-запрос выполняет именно так что мне нужно (идентификатор явно заменяется действительным идентификатором роли):
SELECT p.id, p.display_name, IF(pr.role_id = ID, 1, 0) AS has_role
FROM permissions p
LEFT OUTER JOIN permission_role pr ON p.id = pr.permission_id;
Пример вывода:
+----+--------------+----------+
| id | display_name | has_role |
+----+--------------+----------+
| 1 | Edit users | 1 |
| 2 | View users | 0 |
| 3 | Delete users | 0 |
+----+--------------+----------+
Может кто-нибудь помочь мне здесь, как это сделать с помощью Eloquent?
Я пробовал это, но всегда возвращается 1
(true) в третьем столбце, в отличие от запроса SQL (как показано выше).
$result = DB::table('permissions')
->leftJoin('permission_role', 'permission_role.permission_id', '=', 'permission_role.role_id')
->select(DB::raw('permissions.id, permissions.display_name, IF(permission_role.role_id = ID, 1, 0) AS has_role'))
->get();
В идеале я хотел бы сделать это без использования DB::raw
Хотя это вполне нормально, если это то, что нужно.
Заранее благодарю за любую помощь!
Структурно запрос Query Builder, который вы показали, выглядит нормально.
Что значит не хорошо выглядеть left join
, Не должно ли это:
->leftJoin('permission_role', 'permission_role.permission_id', '=', 'permission_role.role_id')
будь таким:
->leftJoin('permission_role', 'permission_role.permission_id', '=', 'permissions.id')
?
Других решений пока нет …