2013-05-07 3 views
1

Привет Спасибо за чтение,соединить 2 таблицы с помощью tablegateway в ZF2

У меня есть две таблицы (используя tablegateway) PROJET и l_agent_projet Они correcly набор, я могу использовать их для вставки, удаления, обновление и т.д. моя база данных

Я пытаюсь соединить эти две таблицы с помощью этой функции:

public function getAgentsByProject($id_projet) 
{ 
    $sql = new Sql($this->tableGateway->adapter) ; 
    $where = new Where() ; 
    $where -> equalTo('l_agent_projet.id_projet', $id_projet) ; 

    $select = $sql->select() ; 
    $select -> from ($this->tableGateway->getTable()) 
      -> join ('projet' , 'projet.id_projet = l_agent_projet.id_projet') 
      -> where($where) ; 

    $result = $this->tableGateway->selectWith($select) ; 

    return $result ; 
} 

Но когда я пытаюсь прочитать результат, используя это в одном из моего контроллера:

 $test = $this->InitProjectByIDAgentTable()->getAgentsByProject('1') ; 
    var_dump($test) ; 
    echo "<br />" ; 

    foreach ($test as $tmp1): 
     foreach ($tmp1 as $tmp2): 
      echo $tmp2 ; 
      echo '+' ; 
     endforeach ; 
     echo "<br />" ; 
    endforeach ; 

Вот что я получил:

object(Zend\Db\ResultSet\ResultSet)#236 (8) { ["allowedReturnTypes":protected]=> array(2) { [0]=> string(11) "arrayobject" [1]=> string(5) "array" } ["arrayObjectPrototype":protected]=> object(Application\Model\LAgentProject)#220 (2) { ["id_agent"]=> NULL ["id_projet"]=> NULL } ["returnType":protected]=> string(11) "arrayobject" ["buffer":protected]=> NULL ["count":protected]=> int(2) ["dataSource":protected]=> object(Zend\Db\Adapter\Driver\Pdo\Result)#235 (8) { ["statementMode":protected]=> string(7) "forward" ["resource":protected]=> object(PDOStatement)#234 (1) { ["queryString"]=> string(179) "SELECT "l_agent_projet".*, "projet".* FROM "l_agent_projet" INNER JOIN "projet" ON "projet"."id_projet" = "l_agent_projet"."id_projet" WHERE "l_agent_projet"."id_projet" = :where1" } ["options":protected]=> NULL ["currentComplete":protected]=> bool(false) ["currentData":protected]=> NULL ["position":protected]=> int(-1) ["generatedValue":protected]=> NULL ["rowCount":protected]=> int(2) } ["fieldCount":protected]=> int(7) ["position":protected]=> int(0) } 
1+1+ 
3+1+ 

Это говорит [ "FieldCount": защита] => INT (7), но может печатать только первые два поля, соответствующие таблице l_agent_projet. Так что есть проблема.

Но когда я копирую SQL команды генерируемый:

SELECT "l_agent_projet".*, "projet".* 
FROM "l_agent_projet" 
INNER JOIN "projet" ON "projet"."id_projet" = "l_agent_projet"."id_projet" 
WHERE "l_agent_projet"."id_projet" = :'1'" 

Он прекрасно работает и печатать все поля.

Я новичок в ZF2, и я не понимаю, что здесь происходит. пс: Работа на PostgreSQL с PDO: PgSQL

ответ

1

Вы должны использовать следующую эти две строки:

$statement = $sql->prepareStatementForSqlObject($select); 
$result = $statement->execute(); 

вместо строки:

$result = $this->tableGateway->selectWith($select) ; 

выше линии будет возвращать массив данных.

+0

Когда я делаю это, я получил: Фатальная ошибка: Вызов функции члена Initialize() на не-объект в/вар/WWW/projet_b/модуль/Application/SRC/Application/Model/LAgentProjectTable .php. И почему я не могу использовать метод toArray для моего $ result в моем контроллере? (Спасибо за быстрый ответ) – aramir

+0

@aramir Я отредактировал свой answer.try, и вы можете использовать метод toArray на нашем наборе результатов. – 2013-05-07 11:12:30

+0

Используя ваше отредактированное решение, у меня есть следующее: Неустранимая ошибка: вызов неопределенного метода Zend \ Db \ Adapter \ Driver \ Pdo \ Результат :: toArray() в/var/www/projet_b/module/Application/src/Приложение/Модель/LAgentProjectTable.php. Но теперь, если я пропущу/не использую метод toArray(), у меня есть все поля ... Не знаю, почему это работает сейчас, какое-то волшебство продолжается с помощью метода selectwith(), который я предполагаю. В любом случае, спасибо за помощь. (извините, не могу проголосовать за вас, мне нужно 15 представителей за это: /) – aramir

0

Чтобы использовать prepareStatementForSqlObject() внутри модели шлюза таблицы, вам нужен экземпляр \ Zend \ Db \ Sql \ Sql, и для этого вам понадобится адаптер.

$adapter = $this->tableGateway->getAdapter(); 
$sql = new Sql($adapter); 
$statement = $sql->prepareStatementForSqlObject($select); 
$result = $statement->execute(); 
Смежные вопросы