2017-01-20 13 views
2

Я пытаюсь внедрить систему проверки подлинности на основе ролей, используя пользовательский поиск.Cakephp 3 findAuth join table return array

public function findAuth(\Cake\ORM\Query $query, array $options) 
{ 
    $query 
    ->select(['id', 'username', 'passwordHash', 'locked', 'roles.role']) 
    ->group('username') 
    ->join([ 
     'table' => 'user_roles', 
     'conditions' => ['user_roles.userid = Users.id']]) 
    ->join([ 
     'table' => 'roles', 
     'conditions' => ['roles.id = user_roles.role']]) 
     ->toArray() 
     ; 
    return $query; 
} 

В результате MySQL запросов я нужен: выберите users.id, имя пользователя, passwordHash, запертый, GROUP_CONCAT (roles.role) роль от пользователей INNER JOIN user_roles на user_roles.userid = users.id INNER JOIN роли на roles.id = user_roles.role группы по users.id

+0

Значит, вы должны возвращать только запрос? –

+0

Мне нужно использовать построитель запросов для генерации запроса MySQL, который я разместил выше, чтобы выбрать 1 строку, содержащую пользователя и несколько ролей: [1] [John] [$ 2 $ 10 ...] [false] ['admin,' tech ',' manager '] –

+1

вы должны вернуть объект запроса, не вызывать -> toArray() в объекте запроса –

ответ

0

Что я, наконец, в конечном итоге происходит с такой:

public function findAuth(\Cake\ORM\Query $query, array $options) 
{ 
    $query 
    ->select(['id', 'username', 'passwordHash', 'locked']) 
    ->join([ 
     'table' => 'user_roles', 
     'conditions' => ['user_roles.user_id = Users.id']]) 
    ->contain(['UserRoles.Roles']) 
    ->join([ 
     'table' => 'roles', 
     'conditions' => ['roles.id = user_roles.role']])    
    ->group(['Users.username']); 
    return $query; 
} 

Это дает мне многомерный массив: user_roles [индекс [идентификатор , user_id, role [id, role]]]

в моем случае у меня есть 2 записей для индекса (0 и 1), и я могу проверить роль пользователя с in_array функции в цикле Еогеасп