Reputation: 2349
I am using symfony 3.4.1, with doctrine/orm 2.5.13. I have 2 tables. store
and store_product
.
In Store
entity I have:
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Store\Product", mappedBy="store")
* @ORM\JoinColumn(name="store_id")
*/
private $products;
and in Store\Product
entity I have composite index with (store_id,product_id). I have:
/**
* @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;
Earlier I produced a native query using the guide. It was only fetching entries from store
table and it worked perfectly.
Now I am trying to join store_product
table and it is not going so well. I am using the following query which returns 1 result.
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;
returns something like:
id | name | store_id | product_id | price
----+------------+----------+------------+-------
1 | Store Name | 1 | 1234567890 | 129
I setup the result set mapping as follows:
$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');
I am getting error: Notice: Undefined index: store
Can anybody see the reason of the error?
Upvotes: 1
Views: 1468
Reputation: 1567
What worked for me was using addJoinedEntityFromClassMetadata
from the ResultSetMappingBuilder
instead of addJoinedEntityResult
. Using the example from the documentation:
/**
* @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');
Upvotes: 0
Reputation: 2349
I managed to get this working at last after 3 months.
Apparently I made a mistake of trusting documentation when I added foreign keys with addFieldResult()
for joined table.
I needed to remove addFieldResult()
lines for store_id
and product_id` and add them like:
$rsm->addMetaResult('stp', 'store_id', 'store_id', true);
$rsm->addMetaResult('stp', 'product_id', 'product_id', true);
It wasn't enough to just add them with addMetaResult()
I had to set 3rd parameter true also.
Even though documentation says 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.
Upvotes: 1