3
public function getInterests($userID) {
    $result = $this->tableGateway->select(function (Select $select) use ($userID) {
                $select->join('interests', 'users_interests.interest_id = interests.interest_id', array('*'), 'left');
                $where = new Where();
                $where->equalTo('user_id', $userID);
                $select->where($where);
            });

    return $result;
}

这是我的方法。它只是从 users_interests 中选择 user_id = $userID 的所有记录并加入“interests”表。到目前为止,一切都很好,但是当尝试显示获取的结果时,连接表中的字段不存在。这是 $result 的转储:

Zend\Db\ResultSet\ResultSet Object
(
[allowedReturnTypes:protected] => Array
    (
        [0] => arrayobject
        [1] => array
    )

[arrayObjectPrototype:protected] => Object\Model\UsersInterests Object
    (
        [settings_id] => 
        [user_id] => 
        [interest_id] => 
    )

[returnType:protected] => arrayobject
[buffer:protected] => 
[count:protected] => 2
[dataSource:protected] => Zend\Db\Adapter\Driver\Pdo\Result Object
    (
        [statementMode:protected] => forward
        [resource:protected] => PDOStatement Object
            (
                [queryString] => SELECT `users_interests`.*, `interests`.* FROM `users_interests` LEFT JOIN `interests` ON `users_interests`.`interest_id` = `interests`.`interest_id` WHERE `user_id` = :where1
            )

        [options:protected] => 
        [currentComplete:protected] => 
        [currentData:protected] => 
        [position:protected] => -1
        [generatedValue:protected] => 0
        [rowCount:protected] => 2
    )

[fieldCount:protected] => 6
[position:protected] => 
)

我非常需要这方面的帮助,因为我应该在周日之前完成我的项目。提前致谢。

4

4 回答 4

2

您可以使用以下内容来应用左连接。$select::JOIN_LEFT 而不是“左”。

public function getInterests($userID) {
    $result = $this->tableGateway->select(function (Select $select) use ($userID) {
        $select->join('interests', 'users_interests.interest_id = interests.interest_id', array('*'), $select::JOIN_LEFT);
        $where = new Where();
        $where->equalTo('user_id', $userID);
        $select->where($where);
    });

    return $result;
}
于 2013-08-10T18:03:07.910 回答
1

看来您在联接的 WHERE 子句中有问题。这也显示在此处的错误中:

 [queryString] => SELECT `users_interests`.*, `interests`.* FROM `users_interests` LEFT JOIN  .
 `interests` ON `users_interests`.`interest_id` = `interests`.`interest_id` 
 WHERE `user_id` = :where1

尝试这个:

$select->from($this->table)
       ->join('interests', 'users_interests.interest_id = interests.interest_id',
         array('*'), 'left');   
$where = new  Where();
$where->equalTo('user_id', $userID) ;
$select->where($where);

我不能完全按照你的代码,就像这里:

$this->tableGateway->select(function (Select $select) use ($userID) {

但是,这里有一篇非常好的文章。我认为,您可以稍微简化代码。

于 2013-03-05T18:45:22.993 回答
1

我以前写过这个,也许它也会对你有所帮助。 具有多个 FROM 表的 TableGateway

于 2013-03-07T13:39:06.953 回答
1

您是否对结果集进行了迭代?您可以看到有两个匹配的行:

[rowCount:protected] => 2

您有一个 ResultSet 对象,但在请求之前它不会加载任何行,当您遍历该对象时,它们是“延迟加载”的。

您可以强制结果集为您获取所有内容:

var_dump($resultSet->toArray()); // force load all rows

或遍历 ResultSet:

foreach($resultset as $row) {
    var_dump($row); // each row loaded on request
}
于 2013-03-07T09:41:20.607 回答