Как создать дочернюю таблицу атрибутов в доктрине 2? - PullRequest
0 голосов
/ 01 октября 2018

Как я могу создать дочернюю таблицу атрибутов с помощью доктрины 2 (в основном, как таблица соединения, но без сущности на другой стороне).Нужно ли создавать для него отдельную сущность (я знаю, что если я создаю ManyToMany с таблицей соединений, она просто создаст таблицу соединений в БД, но не создаст сущность).

т.е.иметь рабочие заказы, которые могут иметь несколько назначенных рабочих дат.Я хочу иметь возможность заполнить таблицу этими датами, поэтому

______________________
|      Orders        |
|____________________|
        id
         1
         2
         3
______________________
|     Order_Dates    |
|____________________|
order_id |   Date
   1     | 2019-01-01     
   1     | 2019-05-01     
   2     | 2019-01-01     
   2     | 2019-02-01     
   2     | 2019-03-01     
   3     | 2019-01-02     
   3     | 2019-01-05     

Итак, в общем, пока у меня есть

class Orders
{
    public function __construct()
    {
        $this->dates = new ArrayCollection();
    }

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * One Order has Many Dates
     */
    private $dates;

    public function getDates() : ArrayCollection
    {
        return $this->dates;
    }

    public function addDate(\DateTime $date): self
    {
        $this->dates->add($date);

        return $this;
    }

    public function setDates(ArrayCollection $dates): self
    {
        $this->dates = $dates;

        return $this;
    }
}

Я предполагаю, что мне нужно @OneToMany или что-то, но против меняЯ ожидаю, что дочерняя таблица будет ЗАПОЛНЕНА ОТ Объектом заказа, а не отображением.Все, что я смотрю в документации по ассоциации доктрин здесь, похоже, предполагает какое-то отображение (возможно, я неправильно его читаю?)

Заранее спасибо!

Редактировать:

Теперь это мои контроллеры:

Заказы

    /**
     * @ORM\OneToMany(targetEntity="OrderDates", mappedBy="order", cascade={"persist", "remove"}, orphanRemoval=TRUE)
     */
    private $dates;

...

    public function getDates() : PersistentCollection
    {
        return $this->dates;
    }

    public function addDate(\DateTime $date): self
    {
        $orderDate = new OrderDates();
        $orderDate->setDate($date);
        $orderDate->setOrder($this);
        $this->dates[] = $orderDate;

        return $this;
    }

    public function setDates(array $dates): self
    {
        foreach($dates as $date)
        {
            $this->addDate(new \DateTime($date));
        }

        return $this;
    }

Даты заказа

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\OrderDatesRepository")
 */
class OrderDates
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="datetime")
     */
    private $date;

    /**
     * @ORM\ManyToOne(targetEntity="Orders", inversedBy="dates")
     */
    private $order;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getDate(): ?\DateTimeInterface
    {
        return $this->date;
    }

    public function setDate(\DateTimeInterface $date): self
    {
        $this->date = $date;

        return $this;
    }

    public function getOrder(): Orders
    {
        return $this->order;
    }

    public function setOrder(Orders $order): self
    {
        $this->order = $order;

        return $this;
    }
}

1 Ответ

0 голосов
/ 01 октября 2018

У вас есть для создания объекта для Order_Dates и использования аннотации OneToMany, если вы хотите создать дополнительную таблицу базы данных для дат заказа.Doctrine не поддерживает ассоциации между объектами, обрабатываемыми Doctrine, и объектами, обрабатываемыми другим драйвером.Doctrine даже не поддерживает ассоциации между сущностями, которые обрабатываются разными менеджерами сущностей.

Подводя итог: Вы должны создать сущность OrderDates и настроить связь традиционным способом.

РЕДАКТИРОВАТЬ: Вы должны настроитьваша ассоциация вот так:

class Orders {
    // id and other fields here...
    /**
     * @ORM\OneToMany(targetEntity="OrderDates", mappedBy="order", cascade={"persist", "remove"}, orphanRemoval=TRUE)
     */
    private $dates;

    public function addDate(\DateTime $date): self
    {
        $orderDate = new OrderDates();
        $orderDate->setDate($date);
        $orderDate->setOrder($this);
        $this->dates[] = $orderDate;

        return $this;
    }
}

class OrderDates {
    // id here...
    /**
     * @ORM\ManyToOne(targetEntity="Order", inversedBy="dates")
     */
    private $order;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;
    // setters and getters here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...