2014-02-05 6 views
0

У меня есть 3 таблицы, с которыми я соединяюсь, таблицы «PurchaseOrderProductsStatus, Product и PutAway».Symfony2 Только пользовательский запрос Возврат 1 Запись, должна возвращаться Несколько

PurchaseOrderProductsStatus Таблица

id | product_id | 
---------------------- 
10 | 1  | 

Таблица продукта

id | Name   | 
--------------------------- 
1 | Acme Product 123 

Приемка Таблица

id | product_id | 
---------------------- 
100 | 1 
101 | 1 

Я могу выводить данные на экран, вопрос я бегу в том, что он возвращает только 1 строку из моей таблицы PutAway. Он должен возвращать 2 строки, такие как ...

Acme Product 123 
     100 - Acme Product 123 
     101 - Acme Product 123 

Вот мой customQuery. Что я делаю не так?

$query = $this->getEntityManager() 
->createQuery(' 
SELECT  pops, pr, pa 
FROM  WIC\PurchaseOrderBundle\Entity\PurchaseOrderProductsStatus pops 
LEFT JOIN pops.product pr 
LEFT JOIN pr.putAway pa 
WHERE  pops.inventoryLocation = :id 
AND   pops.account = :account_id 
') 
->setParameter('id', $id) 
->setParameter('account_id', $account_id); 

Немного информации о моей настройке. В моем объекте продукта у меня есть ассоциация oneToMany для таблицы PutAway.

/** 
* @ORM\OneToMany(targetEntity="WIC\InventoryBundle\Entity\PutAway", mappedBy="product", fetch="EAGER") 
*/ 
protected $putAway; 

public function __construct() 
{ 
    $this->putAway = new ArrayCollection(); 
} 

Вот мой шаблон веточка:

{% for action in productActions %} 
    <tr> 
     <td>{{ action.product.id }}</td> 
     <td>{{ action.product.sku }}</td> 
     <td>{{ action.product.name }}</td> 
     <td>{{ action.qty }}</td> 
     <td>0</td> 
    </tr> 
    <tr> 
     <td colspan="5"> 
      <div class="row-fluid"> 
       <div class="span2"> 
        <table class="table table-striped table-bordered"> 
         <thead> 
         <tr> 
          <th>Purchase Order</th> 
         </tr> 
         </thead> 
         <tbody> 
         <tr> 
          <td></td> 
         </tr> 
         </tbody> 
        </table> 
       </div> 
       <div class="span10"> 
        <table class="table table-bordered" id="put_away_{{ action.product.id }}"> 
         <thead> 
         <tr> 
          <th>Put Away Location</th> 
          <th>Quantity</th> 
          <th>Date</th> 
          <th>Entered By</th> 
         </tr> 
         </thead> 
         <tbody> 
         {% for putAway in action.product.putAway %} 
          <tr class="info"> 
           <td>{{ putAway.inventoryLocation.name }}</td> 
           <td>{{ putAway.qty }}</td> 
           <td>{{ putAway.created|date("m/d/Y") }}</td> 
           <td>{{ putAway.createdBy.firstName }} {{ putAway.createdBy.lastName }}</td> 
          </tr> 
         {% endfor %} 
         </tbody> 
        </table> 
       </div> 
      </div> 
     </td> 
    </tr> 
{% endfor %} 
+0

Уточнить вопрос с помощью свойства 'PutAway # product'? Какой '@ JoinColumn' вы там определили? Кроме того, проверьте панель инструментов dev, чтобы увидеть, какой запрос выполняется, и попробуйте запустить его непосредственно из консоли SQL. –

+0

Простите мое невежество. Я не знаю, что это значит: «Можете ли вы обновить вопрос с помощью свойства продукта PutAway #». Я новичок в Symfony. – LargeTuna

+0

Все в порядке, я буду продолжать писать как «asnwer» из-за лучшей возможности форматирования;) –

ответ

0

Я вижу, что вы определили следующее соотношение:

/** 
* @ORM\OneToMany(targetEntity="WIC\InventoryBundle\Entity\PutAway", mappedBy="product",  fetch="EAGER") 
*/ 
protected $putAway; 

mappedBy="product" говорит мне, что PutAway лицо имеет product свойство - вероятно, определяется как @ManyToOne (противоположное).

Как вы знаете, в отношениях, если опустить @JoinColumn (или @JoinTable для многих ко многим) Doctrine будет считать имена столбцов по умолчанию и попытаться соединить таблицы. Однако это может привести к неожиданным результатам (например, вашим).

Теперь важная часть: если вы хотите, чтобы были использованы правильные столбцы, вам нужно установить аннотацию @JoinColumn с одной стороны отношения.В вашем примере:

сущности продукта

/** 
* @ORM\OneToMany(targetEntity="WIC\InventoryBundle\Entity\PutAway", mappedBy="product",  fetch="EAGER") 
* @ORM\JoinColumn(name="id", referencedColumnName="id_product") 
*/ 
protected $putAway; 

Альтернативное решение будет:

Приемка объект

/** 
* @ORM\ManyToOne(targetEntity="WIC\InventoryBundle\Entity\Product", inversedBy="putAway", fetch="EAGER") 
* @ORM\JoinColumn(name="id_product", referencedColumnName="id") 
*/ 
protected $product; 

В @JoinColumn аннотации:

  • name представляет собой локальный (гм, некоторые лучше термин может быть) колонок
  • referencedColumnName представляет собой внешнюю колонку

Будет ли это работать?

+0

Да, это просто делает то же самое, что у меня уже есть. Я все еще получаю только одну запись «PutAway», чтобы возвращаться вместо записей «PutAway». Я просто не знаю, почему он вернется только 1, а не оба. Я добавил вашу строку «* @ORM \ JoinColumn (name =« id », referencedColumnName =« id_product »)« к объекту продукта, но никаких изменений в количестве возвращенных результатов. – LargeTuna

+0

Странно. Итак, попробуйте нажать «Запросы» на панели инструментов отладки. Это должно дать вам все выполненные запросы. Найдите это, добавьте его в свой вопрос;) –

Смежные вопросы