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;
}

これが私の方法です。user_id = $userID の users_interests からすべてのレコードを選択し、「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

1

結果セットを繰り返しましたか?2つの一致する行があることがわかります。

[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 に答える
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 に答える