我有一个我一起加入的3个表," paskureorderproductsstatus,product and potaway"桌子。
paskureordorproductsstatus表
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 WICPurchaseOrderBundleEntityPurchaseOrderProductsStatus 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表。
/**
* @ORMOneToMany(targetEntity="WICInventoryBundleEntityPutAway", 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 %}
我看到您已经定义了以下关系:
/**
* @ORMOneToMany(targetEntity="WICInventoryBundleEntityPutAway", mappedBy="product", fetch="EAGER")
*/
protected $putAway;
mappedBy="product"
告诉我PutAway
实体具有product
属性 - 可能定义为@ManyToOne
(相反)。
您可能知道,在关系中,如果您省略了@JoinColumn
(或多个对数量的@JoinTable
)Doctrine
将假设默认列名称并尝试加入表。但是,这可能会产生意外的结果(例如您的结果)。
现在重要的部分:如果要确保使用正确的列,则需要在关系的一侧设置@JoinColumn
注释。在您的示例中:
产品实体
/**
* @ORMOneToMany(targetEntity="WICInventoryBundleEntityPutAway", mappedBy="product", fetch="EAGER")
* @ORMJoinColumn(name="id", referencedColumnName="id_product")
*/
protected $putAway;
替代解决方案是:
putaway Entity
/**
* @ORMManyToOne(targetEntity="WICInventoryBundleEntityProduct", inversedBy="putAway", fetch="EAGER")
* @ORMJoinColumn(name="id_product", referencedColumnName="id")
*/
protected $product;
在@JoinColumn
注释中:
-
name
代表本地(HM,一些更好的术语)列 -
referencedColumnName
代表外国列
这个可以工作吗?