Symfony OneToMany持久数据

时间:2018-05-17 02:03:56

标签: symfony symfony-3.4

我使用的是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表中的每一行复制框,如下所示:

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

在控制器中,我计划为每个已检查的foreach(){}Type以及setHouse()制作setPrice()。还有其他更有效的方法吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

为了定义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)

OneToOne:

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

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

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

希望我很清楚。

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