0
我想用Zend Framework 2的SQL类使用两个左外连接,但由于某种原因,它没有返回一个结果,但另一个工作正常。我已经在MySQL Workbench中运行了实际的SQL,并且它的返回与我想要的一样,但它并没有在Zend Framework中执行。这里是我的代码:Zend Framework 2 SQL Join Issue
纯SQL:
SELECT groups.group_name, members.username, groups.id FROM groups
LEFT OUTER JOIN group_admins ON groups.id = group_admins.group_id
LEFT OUTER JOIN members ON group_admins.user_id = members.id
WHERE group_admins.user_id = " . parent::getUserId()['id']
返回的结果我想,(这可以在这里看到:http://imgur.com/8ydmn4f)
现在,这里是Zend框架2的代码,我有到位:
$select_admins = new Select();
$select_admins->from(array(
'g' => 'groups',
))
->join(array(
'ga' => 'group_admins'
), 'g.id = ga.group_id')
->join(array(
'm' => 'members'
), 'ga.user_id = m.id', array('username'))
->where(array('ga.user_id' => parent::getUserId()['id']));
$query_group_admin = parent::$sql->getAdapter()->query(parent::$sql->buildSqlString($select_admins), Adapter::QUERY_MODE_EXECUTE);
$group_admins = array();
foreach ($query_group_admin as $group_admin) {
$group_admins[] = $group_admin;
}
// get the group members
$select = new Select();
$select->from(array(
'g' => 'group_members'
))
->join(array(
'm' => 'members'
), 'g.member_id = m.id')
->join(array(
'grp' => 'groups'
), 'g.group_id = grp.id')
->where(array(
'g.group_id' => $group_id
));
$query = parent::$sql->getAdapter()->query(parent::$sql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE);
$member_username = array();
foreach ($query as $member) {
$member_username[] = $member['username'];
}
// get the rest of the group info
$fetch = $this->gateway->select(array(
'id' => $group_id
));
$row = $fetch->current();
if (!$row) {
return false;
}
return array(
'admins' => implode(", ", $group_admins),
'members' => implode(", ", $member_username),
'info' => $row
);
控制器:
public function grouphomeAction()
{
$id = $this->params()->fromRoute('id', 0);
if (0 === $id) {
return $this->redirect()->toRoute('members/groups', array('action' => 'index'));
}
if (!$this->getGroupsService()->getGroupInformation($id)) {
return $this->redirect()->toRoute('members/groups', array('action' => 'index'));
}
return new ViewModel(array('group_info' => $this->getGroupsService()->getGroupInformation($id)));
}
但是,这仅显示组名,组创建者和组成员,但将组管理员字段留空。
这里是数组的print_r返回结果:
Array ([admins] => [members] => jimmysole, fooboy [info] => ArrayObject Object ([storage:ArrayObject:private] => Array ([id] => 2 [group_name] => Tim's Group [group_creator] => timlinden [group_created_date] => 2017-01-16 17:39:56)))
如果有帮助,下面是截图以及页面 - http://imgur.com/xUQMaUu
任何帮助,将不胜感激!
谢谢。
这是说我有一个sql语法错误。我不知道它是否有所作为,但Select :: JOIN_OUTER_LEFT正在返回OUTER LEFT JOIN,但mysql手册说明它的LEFT OUTER JOIN。 例外情况: PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法中有错误;检查与您的MariaDB服务器版本相对应的手册,以便在'OUTER LEFT JOIN'group_admins' as'ga' ON'ga'.'user_id' ='groups'.'id' OUTER L''第1行附近使用正确的语法 – user2101411
这里是我现在查看您的示例后的代码 $ select_admins - > from('groups') - > join(array('ga'=>'group_admins'),'ga.user_id =数组('''''''''''','ga.user_id = m.id'),array('ga_user_id'=>'group_admins.user_id'),Select :: JOIN_OUTER_LEFT - > join ,array('m_username'=>'m.username'),Select :: JOIN_OUTER_LEFT) - > where(array('id'=> $ group_id)); – user2101411
对不起,我的理解是你不能执行LEFT OUTER JOIN。它可以是LEFT或OUTER ...检查选择类的文档以确认...也许你可以运行一个原始查询呢?为了达到必要的结果? – dixromos98