2016-02-08 8 views
3

Я использую структуру таблицы по умолчанию Entrust в:Eloquent IF условие - всегда возвращает истину

разрешения таблицы:

+--------------+------------------+------+-----+---------+----------------+ 
| 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 |    | 
+--------------+------------------+------+-----+---------+----------------+ 

permission_role стол:

+---------------+------------------+------+-----+---------+-------+ 
| 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

Последний оказался немного сложным в «Красноречии». Этот SQL-запрос выполняет точно то, что мне нужно (ID очевидно заменяется действительным роль ID):

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, хотя это вполне нормально, если это то, что он принимает.

Заранее благодарим за любую помощь!

+0

В версии Eloquent вы заменили «ID» действительным идентификатором роли? Должен код, который это делает. – Barmar

ответ

1

Структурированный запрос Query Builder, который вы показали, выглядит отлично.

Что делает не посмотреть хорошо, это left join. Не следует так:

->leftJoin('permission_role', 'permission_role.permission_id', '=', 'permission_role.role_id') 

быть таким:

->leftJoin('permission_role', 'permission_role.permission_id', '=', 'permissions.id') 

?

+0

Вот и все! Спасибо, дополнительная пара глаз определенно помогает после долгого дня. –

 Смежные вопросы

  • Нет связанных вопросов^_^