2013-03-05 3 views
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_interests с user_id = $ userID и присоединяется к таблице «интересы». Пока что так хорошо, но при попытке отобразить полученные результаты поля из объединенной таблицы просто не существуют. Вот дамп $ результата:Zend Framework 2: LEFT JOIN issue

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] => 
) 

Мне очень нужна помощь по этому вопросу, потому что я должен не закончить проект до воскресенья. Заранее спасибо.

ответ

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) { 

Но вот very nice article на это. Я думаю, вы можете немного упростить свой код.

+0

Проблема остается неизменной после того, как я отредактировал запрос. Пожалуйста, проверьте первый пост. –

+0

Я думаю, вы не обновили свалку результата $? –

+0

Я обновил его. Это то же самое. –

1

Вы перечислили результаты? Вы можете видеть, что есть две соответствующие строки:

[rowCount:protected] => 2 

у вас есть объект ResultSet, но она не будет загружать любого из строк, пока требуется, они «ленивые загружены», когда вы итерация над объектом.

Вы можете заставить ResultSet, чтобы получить их все для вас:

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

или перебрать ResultSet:

foreach($resultset as $row) { 
    var_dump($row); // each row loaded on request 
} 
2

Для применения левого соединения вы можете использовать следующее. $ select :: JOIN_LEFT вместо '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; 
}