Symfony OneToMany 持久化数据

Symfony OneToMany persisting data

我正在使用 Symfony3.4,并且在 HouseType 实体之间的数据库中具有以下关系:

                  house 
+----------------------------------------------+
| id |     title    |       description        |
+----------------------------------------------+
| 1  | some title 1 |    some description 1    |
+----------------------------------------------+
| 2  | some title 2 |    some description 2    |
+----------------------------------------------+

       type 
+----------------+
| id |   name    |
+----------------+
| 1  | shortstay |
+----------------+
| 2  | rent      |
+----------------+
| 4  | sell      |
+----------------+

                  house_types
+-----------------------------------+
| id | house_id | type_id |  price  |
+-----------------------------------+
| 1  |    1     |   2     | 1000    |
+-----------------------------------+
| 2  |    1     |   3     | 1000000 |
+-----------------------------------+
| 3  |    2     |   1     | 100     |
+-----------------------------------+
| 4  |    2     |   3     | 200000  |
+-----------------------------------+

这是我的实体:

房子实体

class House extends EntityBase
{
    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\HouseHasTypes", mappedBy="houses", cascade={"persist","remove"})
     */
    protected $hasTypes;

类型实体

class Type extends EntityBase
{
    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\HouseHasTypes", mappedBy="types", cascade={"persist","remove"})
     */
    protected $hasHouses;

HouseHasTypes 实体

class HouseHasTypes extends EntityBase
{
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\House", cascade={"persist"}, fetch="EAGER")
     * @ORM\JoinColumn(name="house_id", referencedColumnName="id", nullable=true)
     */
    protected $houses;
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Type", cascade={"persist","remove"}, fetch="EAGER" )
     * @ORM\JoinColumn(name="type_id", referencedColumnName="id",nullable=true)
     */
    protected $types;
    /**
     * @var int
     * 
     * @ORM\Column(name="price", type="integer")
     */
    protected $price;

我不太明白 ManyToOne 和 OneToOne 关系之间的区别。我的应该是哪一个?

此外,处理将新数据插入 2 个实体(HouseHouseHasTypes)的最简单方法是什么。现在我可以呈现 type table 中每一行的复选框,如下所示:

$builder
...
->add('hasTypes', EntityType::class, array(
                'required' => true,
                'class' => Type::class,
                'expanded' => true,
                'multiple' => true,
            ))

我计划在控制器中为每个选中的 TypesetHouse() 以及 setPrice() 创建一个 foreach(){}。还有其他更有效的方法吗?

如何呈现与上述 EntityType 复选框一样多的文本框,以便为每个选定的 Type 定义价格?我目前正在对三个 html 输入文本元素进行硬编码,并根据选中的复选框使用 javascript 隐藏它们。如果我制作自定义表单,我如何告诉它呈现 3 个文本输入(因为实体中有 3 行 table)

抱歉问了这么多问题。任何帮助将不胜感激

您的数据库模型似乎是正确的。

为了给你定义OneToMany、ManyToOne和OneToOne关系,我给你举了几个例子:

假设我们有两个实体:USER 和 ORDER。

一对多:

一个用户可以执行 0 个、1 个或多个订单,对吗?这意味着一个用户可以链接到 0、1 或许多订单。

USER(id:1) --> ORDER(id:1)
           --> ORDER(id:3)
           --> ORDER(id:8)

多对一:

一个订单只能由一个用户完成吗?这意味着许多订单可以链接到一个用户。

ORDER(id:1) --> USER(id:1)
ORDER(id:3) --> USER(id:1)
ORDER(id:8) --> USER(id:1)

一对一:

现在假设我们有另外两个实体:USER 和 EMAIL。

一个用户只能有一个电子邮件地址,一个电子邮件地址只能有一个用户吗?这意味着一个用户可以链接到一个电子邮件地址,一个电子邮件地址可以链接到一个用户。

USER(id:1) --> EMAIL(id:6)
USER(id:3) --> EMAIL(id:7)
USER(id:8) --> EMAIL(id:1)

希望我说清楚了。

对于您的其他问题,如果您在实体中正确定义了 getter 和 setter,Symfony 将自动在表单提交时插入数据,无需执行 foreach