0

我目前正在使用以下代码

    $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 是一个包含所有 id 的数组。

可以使用 JOIN 子句来完成吗?

4

1 回答 1

1

此查询应在应用程序的最低层完成,堆栈的下一层将是您的映射器。在您的映射器层中,您可以映射到您的实体,这将是一个“员工”实体(对象),其中包含一个“员工权限”的集合和一个“权限”的集合

模型图:

-----------
| 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;
于 2013-06-20T04:27:08.020 回答