2015-06-27 3 views
1

Я две сущности, Carros и Msg, я ищу, чтобы получить Carros, которые имеют Msg сообщенияКак присоединиться к двум объектам с доктриной 2 и zf2?

$query = $entityManager->createQuery(" 
    SELECT u 
    FROM Auto\Entity\Carros u 
    JOIN Auto\Entity\Msg m WITH m.idautoad=u.idcarros 
    WHERE u.identidade='".$emailidentidade."' 
    ORDER BY u.datadoanuncio DESC 
    "); 

Я использую Paginator:

// Create the paginator itself 
$paginator = new Paginator(
     new DoctrinePaginator(new ORMPaginator($query)) 
); 

и я получаю следующие ошибки я имеют zend 2.3.9 и доктрину 2.4

Arquivo: C: \ websites \ aut о \ поставщик \ ZendFramework \ ZendFramework \ Библиотека \ Zend \ Paginator \ Paginator.php: 637

Mensagem: Ошибка получение итератора

C: \ сайтов \ \ автоматического поставщика \ доктрина \ ORM \ Lib \ Doctrine \ ORM \ Tools \ Разбивка \ WhereInWalker.php: 85

Mensagem:

не может рассчитывать запрос, который выбирает два из компонентов, не может сделать различие

его генерацией ошибки, когда я тр у сделать это:

$fi = $query->getResult(); 

, а затем

$paginator = new \Zend\Paginator\Paginator(new 
       \Zend\Paginator\Adapter\ArrayAdapter($fi) 
     ); 
+0

Вы смотрите http://stackoverflow.com/questions/12785143/doctrine-pagination-with-left-joins? – hkulekci

+0

У вас есть отношения ManyToOne между Carros и Msg? Если вы это сделаете, проверьте следующее: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html # one-to-many-twoirectional. В конце с этим двунаправленным преобразованием вам не нужно создавать соединение в вашем запросе, и вы можете решить свою проблему. – Hooli

ответ

0

В случае, если у вас есть отношения ManyToOne вы можете сделать так:

foreach ($paginator as $carro) 
{} 

при получении результатов, как это ошибка исчезает (не забудьте увидеть эту ссылку раньше, чтобы сделать правильность вашего картографирования: Bidirectionnal ManyToOne relation

public function getInvoices($idProformaGroup, $paginate = false) 
    { 
     $query = $this->getEntityManager()->createQueryBuilder(); 
     $query->select('po', 'i') 
      ->from('Invoice\Entity\Proforma', 'po') 
      ->innerJoin('po.idInvoice', 'i') 
      ->andWhere("po.idProformaGroup = :idProformaGroup") 
      ->orderBy('po.idProforma', 'ASC') 
      ->setParameter('idProformaGroup', $idProformaGroup); 
     if ($paginate) { 
      $doctrineAdapter = new DoctrineAdapter(new ORMPaginator($query, true)); 
      return new Paginator($doctrineAdapter); 
     } else { 
      return $query->getQuery()->getResult(); 
     } 
    } 

Как вы видите, мое соединение использует внешний ключ po.idInvoice для объединения двух таблиц. И из-за этого мой Paginator не показывает мне вашу ошибку.

РЕДАКТИРОВАТЬ: С параметром я могу выбрать разбиение на страницы или нет. Не используйте его, если он вам не нужен.

РЕДАКТИРОВАТЬ 2: От ссылки на другой вопрос присоединяйтесь до Doctrine : Pagination with left Joins Ответ на futurereal - это то же самое, что я пытался объяснить вам.

-1

я не использую в малейшей новый DoctrinePaginator (новый ORMPaginator ($ запроса))

теперь я использую \ Zend \ Paginator \ Paginator и его работы $ ц = $ query-> GetResult();

$ paginator = new \ Zend \ Paginator \ Paginator (новый \ Zend \ Paginator \ Adapter \ ArrayAdapter ($ fi) );