2017-01-20 45 views
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

任何帮助,将不胜感激!

谢谢。

回答

0

基本上你的连接是内部连接......我知道......你现在必须讨厌Zend:p。默认情况下,它们是INNER JOINS,所以我认为这是错误的。所以试着指定连接的类型,你应该没问题。你可以在这里找到更多的例子:examples

$select12->from('foo')->join('zac', 'm = n', array('bar', 'baz'), Select::JOIN_OUTER); 
+0

这是说我有一个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

+0

这里是我现在查看您的示例后的代码 $ 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

+0

对不起,我的理解是你不能执行LEFT OUTER JOIN。它可以是LEFT或OUTER ...检查选择类的文档以确认...也许你可以运行一个原始查询呢?为了达到必要的结果? – dixromos98