Evren Yurtesen
Evren Yurtesen

Reputation: 2349

Doctrine addJoinedEntityResult gives error with oneToMany/manyToOne

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

Answers (2)

KiNgMaR
KiNgMaR

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

Evren Yurtesen
Evren Yurtesen

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

Related Questions