2013-06-20 3 views
0

настоящее время я использую следующий кодПредложение Zend JOIN возвращает массив в объекте?

$select = $this->select() 
       ->setIntegrityCheck(false) 
       ->from(array('st' => $this->_name)) 
       ->join(array('sp' => 'staff_permissions'), 'sp.staff_id = st.id and sp.pool_id = ' . $pool_id) 
       ->join(array('p' => 'permissions'), 'p.id = sp.permission_id') 
       ->where('staff_id = ?', $staff_id); 
    return $this->fetchAll($select)->toArray(); 

Он сочетает в себе три таблицы и возвращает результат. Таблица «st» соответствует одному персоналу (так что одна строка), а две другие таблицы соответствуют нескольким строкам. Так что я надеялся получить один объект назад, так что две другие таблицы являются массивами внутри объекта.

Так, например, я возвращаю $ row, так что $ row-> first_name - это имя, но $ row-> permission_id - это массив со всеми идентификаторами в нем.

Можно ли это сделать с помощью предложения JOIN?

ответ

1

Этот запрос должен выполняться на нижнем уровне вашего приложения, следующим слоем на стек будет ваш mappers. В вашем картографа слое можно сопоставить с вашим Entities, который будет объект «ПЕРСОНАЛ» (объект), который содержит коллекцию для & коллекции «staff_permissions» для

модели диаграммы «разрешения»:

----------- 
| service | // business logic 
----------- 
    | 
----------- 
| mapper | // maps external data to internal entities (or vice versa) 
----------- 
    | 
----------- ---------------------- 
|dao (sql)| -> | zend table gateway | 
----------- ---------------------- 

Пример кода примера:

$staffEntity = new StaffEntity(); 
$staffEntity->setName($response['name']); 

foreach($response['staff_permissions] as $permission) { 
    $permission = new Permission(); 
    $permission->setName($permission['name']); 
    $permission->setRule($permission['rule']); 
    // ... etc ... 
    $staffEntity->addPermission($permission); 
} 

// ... same for permissions ... 

return $staffEntity; 
Смежные вопросы