Search code examples
ormdoctrine-ormassociationsentitynette

Doctrine 2 get items from related entities


I have an entity with ManyToOne, OneToOne relations. I have another entity, which is linked to the first one and what I want to do is to get information about the first entity as well as all other entities, which are related to it.

For some reason when I make the call, it returns NULL in the related entity.

Code:

<?php

namespace App\Model\Entities;

use Doctrine\ORM\Mapping as ORM,
    Doctrine\Common\Collections\ArrayCollection;
use Kdyby\Doctrine\Entities\BaseEntity;

/**
 * Doctrine entity for resorts in destinations
 * @package App\Model\Entities
 * @ORM\Entity
 */
class Resort extends BaseEntity
{

    /**
     * autoincremented resort id
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * resort name
     * @ORM\Column(type="string")
     */
    protected $title;

    /**
     * @ORM\OneToOne(targetEntity="ResortProperties", mappedBy="resort", cascade={"persist"})
     */
    private $properties;

    public function __construct()
    {
        $this->properties = new ArrayCollection();
    }

    /**
     * HERE I WANT TO GET DATA FROM ANOTHER ENTITY
     * @return type
     */
    public function getProperties()
    {
        return $this->properties;
    }

}

And the related entity is this:

<?php

namespace App\Model\Entities;

use Doctrine\ORM\Mapping as ORM,
    Doctrine\Common\Collections\ArrayCollection;
use Kdyby\Doctrine\Entities\BaseEntity;

/**
 * Doctrine entity for resort properties
 * @package App\Model\Entities
 * @ORM\Entity
 */
class ResortProperties extends BaseEntity
{

    /**
     * autoincremented id
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * resort id
     * @ORM\OneToOne(targetEntity="Resort", inversedBy="Resort", cascade={"persist", "remove"})
     * @ORM\JoinColumn(onDelete="CASCADE")
     */
    protected $resort;

    /**
     * parameter1
     * @ORM\Column(type="string")
     */
    protected $parameter1;
}

I expected, that when I call $repository->findAll(); I would get all Resort entities and in Resort->properties would be joined ResortProperty entity, but it is NULL.

I don't know what I did wrong, can someone point out my mistake? Thanks


Solution

  • I assume the problem is the JoinColumn-Annotation. The Entity with the Foreign-key (ResortProperties) needs to know, how to join the two tables. The "inversedBy"-Statement on the Resort-Entity then uses this rule.

    It should look something like the following in your ResortProperties-Entity:

        /**
         * resort id
         * @ORM\OneToOne(targetEntity="Resort", inversedBy="Resort", cascade={"persist", "remove"})
         * @ORM\JoinColumn(name="resort_id", referencedColumnName="id")
         */
        protected $resort;
    

    "resort_id" is the name of your foreign-key-column.

    Hope this helps.