Symfony2 / Doctrine2 один-ко-многим один и тот же объект дважды - PullRequest
2 голосов
/ 22 марта 2012

У моего текущего Client-Entity есть область выгрузки и загрузки, которые оба являются ClientArea-Entities.

namespace ACME\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Sorien\DataGridBundle\Grid\Mapping as GRID;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * ACME\DemoBundle\Entity\Client
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="ACME\DemoBundle\Entity\ClientRepository")
 */
class Client
{
enter code here/**
 * @ORM\OneToMany(targetEntity="ClientArea",mappedBy="client", cascade={"persist", "remove"})
 */
public $unloading_areas; 

/**
 * @ORM\OneToMany(targetEntity="ClientArea",mappedBy="client", cascade={"persist", "remove"})
 */
public $loading_areas; 
}

_

class ClientArea
{
     /**
     * @ORM\ManyToOne(targetEntity="Client")
     */
    public  $client;
}

Это не работает, поскольку клиент можеткарта 1 ассоциация.Как правильно сопоставить отношение?

1 Ответ

1 голос
/ 25 марта 2012

Для создания отношений сущностей вам необходимо иметь ключи, которые будут использоваться при объединении таблиц. В вашем клиентском классе должен быть определен ключ id, и вам нужно инициализировать коллекции, например:

class Client
{
    //....

    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="ClientArea", mappedBy="client", cascade={"persist", "remove"})
     */
    public $unloading_areas; 

    /**
     * @ORM\OneToMany(targetEntity="ClientArea", mappedBy="client", cascade={"persist", "remove"})
     */
    public $loading_areas; 

    public function __construct() {
        // Initialize collections
        $this->unloading_areas = new \Doctrine\Common\Collections\ArrayCollection();
        $this->loading_areas = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ....
}

Ваш класс ClientArea должен выглядеть примерно так:

class ClientArea
{
    // ....

    /**
     * @ORM\Column(name="client_id", type="int", nullable=false)
     */
    private $clientId;

    /**
     * @ORM\ManyToOne(targetEntity="Client")
     * @JoinColumn(name="client_id", referencedColumnName="id")
     */
    public  $client;

    // ....
}

Теперь эти два объекта должны быть правильно отображены. Чтобы узнать больше о сопоставлении ассоциаций в Doctrine, прочитайте статью здесь: http://docs.doctrine -project.org / projects / doctrine-orm / en / 2.0.x / reference / association-mapping.html

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...