我使用的是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
表中的每一行复制框,如下所示:
$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行)
很抱歉问了这么多问题。任何帮助将不胜感激
答案 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)
现在假设我们还有另外两个实体:USER和EMAIL。
用户可以拥有一个且只有一个电子邮件地址,而电子邮件地址只能拥有一个用户权限吗?这意味着一个用户可以链接到一个电子邮件地址,一个电子邮件地址可以链接到一个用户。
USER(id:1) --> EMAIL(id:6)
USER(id:3) --> EMAIL(id:7)
USER(id:8) --> EMAIL(id:1)
希望我很清楚。
对于您的其他问题,如果您在实体中正确定义了getter和setter,则Symfony会自动在表单提交中插入数据foreach