![](/img/trans.png)
[英]OneToMany and ManyToOne relation in Doctrine - strange mapping error
[英]Doctrine addJoinedEntityResult gives error with oneToMany/manyToOne
我正在使用 symfony 3.4.1,以及学说/orm 2.5.13。 我有2张桌子。 store
和store_product
。
在Store
实体中,我有:
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Store\Product", mappedBy="store")
* @ORM\JoinColumn(name="store_id")
*/
private $products;
在Store\\Product
实体中,我有 (store_id,product_id) 的复合索引。 我有:
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Store", inversedBy="products")
* @ORM\JoinColumn(name="store_id",referencedColumnName="id",nullable=false,onDelete="CASCADE")
* @ORM\Id()
* @ORM\GeneratedValue("NONE")
* @var $store \AppBundle\Entity\Store
*/
protected $store;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Product", inversedBy="stores")
* @ORM\JoinColumn(name="product_id",referencedColumnName="id",nullable=false,onDelete="CASCADE")
* @ORM\Id()
* @ORM\GeneratedValue("NONE")
* @var $product \AppBundle\Entity\Product
*/
protected $product;
早些时候,我使用指南生成了一个本机查询。 它只是从store
表中获取条目,并且运行良好。
现在我正在尝试加入store_product
表,但进展并不顺利。 我正在使用以下查询返回 1 个结果。
SELECT st.id, st.name, stp.store_id, stp.product_id, stp.price FROM store st LEFT JOIN store_product stp ON st.id = stp.store_id WHERE st.id=1 LIMIT 1;
返回类似:
id | name | store_id | product_id | price
----+------------+----------+------------+-------
1 | Store Name | 1 | 1234567890 | 129
我设置结果集映射如下:
$rsm = new ResultSetMapping();
$rsm->addEntityResult('AppBundle\Entity\Store', 'st');
$rsm->addFieldResult('st', 'id', 'id');
$rsm->addFieldResult('st', 'name', 'name');
$rsm->addJoinedEntityResult('AppBundle\Entity\Store\Product', 'stp',
'st', 'products');
$rsm->addFieldResult('stp','store_id', 'store');
$rsm->addFieldResult('stp','product_id','product');
$rsm->addFieldResult('stp','price','price');
我收到错误: Notice: Undefined index: store
任何人都可以看到错误的原因吗?
3 个月后,我终于设法让这个工作了。
显然,当我使用addFieldResult()
为连接表添加外键时,我犯了信任文档的错误。
我需要删除addFieldResult()
为线store_id
和product_id`并将它们添加,如:
$rsm->addMetaResult('stp', 'store_id', 'store_id', true);
$rsm->addMetaResult('stp', 'product_id', 'product_id', true);
仅使用addMetaResult()
添加它们是不够的,我还必须将第三个参数设置为 true。
即使文档说Consequently, associations that are fetch-joined do not require the foreign keys to be present in the SQL result set, only associations that are lazy.
对我addJoinedEntityFromClassMetadata
是使用ResultSetMappingBuilder
的addJoinedEntityResult
而不是addJoinedEntityResult
。 使用文档中的示例:
/**
* @param string $class The class name of the joined entity.
* @param string $alias The unique alias to use for the joined entity.
* @param string $parentAlias The alias of the entity result that is the parent of this joined result.
* @param string $relation The association field that connects the parent entity result
* with the joined entity result.
*/
$rsm->addJoinedEntityFromClassMetadata(Address::class, 'a', 'u', 'address');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.