【问题标题】:Zend Framework 2 SQL Join IssueZend Framework 2 SQL 连接问题
【发布时间】:2017-01-21 05:40:43
【问题描述】:

我正在尝试对 Zend Framework 2 的 SQL 类使用两个左外连接,但由于某种原因,它没有返回一个结果,但另一个工作正常。我已经在 MySQL Workbench 中运行了实际的 SQL,它返回的结果就像我想要的那样,但它不是用 Zend Framework 来做的。这是我的代码:

纯 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 Framework 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

任何帮助将不胜感激!

谢谢。

【问题讨论】:

    标签: mysql zend-framework


    【解决方案1】:

    基本上,您的联接是 INNER JOINS...我知道....您现在一定讨厌 Zend :p 。默认情况下,它们是 INNER JOINS,所以我认为这是错误的。所以尝试指定连接的类型,你应该没问题。您可以在此处找到更多示例:examples

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

    【讨论】:

    • 这是说我有一个 sql 语法错误。我不知道这是否有所不同,但 Select::JOIN_OUTER_LEFT 正在返回 OUTER LEFT JOIN 但 mysql 手册说它的 LEFT OUTER JOIN。异常是: PDOException: SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 'OUTER LEFT JOIN group_admins AS ga ON ga.user_id = groups.id OUTER L' 附近使用正确的语法
    • 这是我在查看您的示例后现在拥有的代码 $select_admins ->from('groups') ->join(array('ga' => 'group_admins'), 'ga .user_id = groups.id', array('ga_user_id' => 'group_admins.user_id'), Select::JOIN_OUTER_LEFT) ->join(array('m' => 'members'), 'ga.user_id = m. id', array('m_username' => 'm.username'), Select::JOIN_OUTER_LEFT) ->where(array('id' => $group_id));
    • 很抱歉,您无法执行 LEFT OUTER JOIN。它可以是 LEFT 或 OUTER...检查选择类的文档以确认...也许您可以运行原始查询?为了达到必要的结果?
    • 我确实切换了外连接,但得到了相同的结果: PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;检查与您的 MariaDB 服务器版本相对应的手册,以获取在 'OUTER JOIN members AS m ON ga.user_id = m.id WHERE groups.@987654337 附近使用的正确语法@ = '' 在第 1 行
    • 假设您正在执行类似此处的操作:framework.zend.com/manual/2.4/en/user-guide/…,那么请注意,如果您不在这些文件中包含列,它们将不会显示在结果中。如果这不是问题,我不知道究竟是什么。它应该适用于我们现在讨论的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2014-11-04
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多