Symfony OneToMany 持久化数据
Symfony OneToMany persisting data
我正在使用 Symfony3.4,并且在 House
和 Type
实体之间的数据库中具有以下关系:
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 个实体(House
和 HouseHasTypes
)的最简单方法是什么。现在我可以呈现 type
table 中每一行的复选框,如下所示:
$builder
...
->add('hasTypes', EntityType::class, array(
'required' => true,
'class' => Type::class,
'expanded' => true,
'multiple' => true,
))
我计划在控制器中为每个选中的 Type
和 setHouse()
以及 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
我正在使用 Symfony3.4,并且在 House
和 Type
实体之间的数据库中具有以下关系:
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 个实体(House
和 HouseHasTypes
)的最简单方法是什么。现在我可以呈现 type
table 中每一行的复选框,如下所示:
$builder
...
->add('hasTypes', EntityType::class, array(
'required' => true,
'class' => Type::class,
'expanded' => true,
'multiple' => true,
))
我计划在控制器中为每个选中的 Type
和 setHouse()
以及 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