Symfony2自定义查询仅返回1条记录,应返回多条

时间:2014-02-05 19:03:23

标签: php mysql sql symfony doctrine-orm

我有3张桌子加入,#34; PurchaseOrderProductsStatus,Product和PutAway"表。

PurchaseOrderProductsStatus表

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

产品表

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

PutAway表

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

我能够将数据输出到屏幕,我遇到的问题是它只从我的PutAway表返回1行。它应该像这样返回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);

关于我的设置的一些信息。在我的产品实体中,我有一个PutAway表的oneToMany Association。

/**
 * @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 %}

1 个答案:

答案 0 :(得分:0)

我看到你已经定义了以下关系:

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

mappedBy="product"告诉我PutAway实体具有product属性 - 可能定义为@ManyToOne(相反)。

正如您所知,在关系中如果省略@JoinColumn(或许多对多为@JoinTableDoctrine将采用默认列名并尝试加入表。但是,这可能会产生意外结果(例如你的)。

现在重要的部分:如果要确保使用正确的列,则需要在关系的一侧设置@JoinColumn注释。在您的示例中:

产品实体

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

替代解决方案是:

PutAway实体

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

@JoinColumn注释中:

  • name代表本地(hm,某些更好的术语)列
  • referencedColumnName代表外国专栏

这会有用吗?