首页 > 解决方案 > 教义2中如何创建子属性表?

问题描述

如何通过学说 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;
    }
}

标签: phpsymfonydoctrine-orm

解决方案


如果为订单日期创建额外的数据库表,则必须为 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
}

推荐阅读