我有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 %}
答案 0 :(得分: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;
替代解决方案是:
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
代表外国专栏这会有用吗?