我有一对多的结构,如下所示:(下面的代码)
房间(id,...,roomSeatings)
RoomSeating(身份证,房间,座位,容量)
座位(id,...,roomSeatings)
座位意味着座位放置在房间内,即:U形
我的目标是生成一个表格:
房间信息(完)
房间的座位信息(带座位的复选框,您可以选择哪些座位可用于房间及以下,每个座位,您输入最大容量的文本字段每个座位。)
我不想将关系实体预先填入所有可能的房间+座位组合,因为这绝对不能很好地扩展 (例如:对于10000个房间* 10个可用座位=> 10万个条目,而如果我们只存储该关联并假设每个房间平均有5个座位,我们得到一半的条目数> => 50 000)
问题: 哪个是最好的表单类型设置,它允许我实现干净,无黑客的实现?
我有一个工作实施,绝对不是很好 问题在于为关联创建表单类型,因为我需要显示所有可用的席位并检查所选的席位(映射不会为我执行此操作,它只会检索所选的席位。)
有什么想法吗?
代码示例:
间:
/**
* Room
*
* @ORM\Table(name="rooms")
* @ORM\Entity(repositoryClass="...\RoomRepository")
*/
class Room
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
(...)
/**
* @var ArrayCollection $roomSeatings;
*
* @ORM\OneToMany(targetEntity="...\RoomSeating", mappedBy="room", cascade={"all"})
*/
protected $roomSeatings;
座位:
/**
* Seating
*
* @ORM\Table(name="seatings")
* @ORM\Entity(repositoryClass="...\SeatingRepository")
*/
class Seating
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var ArrayCollection $roomSeatings;
*
* @ORM\OneToMany(targetEntity="...\RoomSeating", mappedBy="seating")
*/
protected $roomSeatings;
RoomSeating:
/**
* RoomSeating
*
* @ORM\Table(name="room_seatings", indexes={@ORM\Index(name="room_capacity_idx", columns={"room_id", "capacity"})})
* @ORM\Entity(repositoryClass="...\RoomSeatingRepository")
*/
class RoomSeating
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var integer
*
* @ORM\Column(name="capacity", type="smallint", options={"unsigned":true})
*/
protected $capacity;
/**
* @ORM\ManyToOne(targetEntity="...\Room", inversedBy="roomSeatings")
* @ORM\JoinColumn(name="room_id", referencedColumnName="id", nullable=false)
*/
protected $room;
/**
* @ORM\ManyToOne(targetEntity="...\Seating", inversedBy="roomSeatings")
* @ORM\JoinColumn(name="seating_id", referencedColumnName="id", nullable=false)
*/
protected $seating;
答案 0 :(得分:1)
您没有编辑"座位"实体,它只是RoomSeating的一个属性中的可能选择。
最好的解决方案可能是将Room作为您正在编辑的主要实体,将RoomSeating作为嵌入式表单。 见http://symfony.com/doc/master/cookbook/form/form_collections.html 该文档还解释了如何添加/删除记录。
唯一剩下的就是如何在网页的界面中使用它。
你可以调整它以使"添加座位" - 按钮添加一行"用户还必须选择座位。这将是最简单和最标准的Symfony2实现。
或者您可以使用实际表单之外的复选框来触发创建/删除"行"在嵌入式表单中使用javascript。 通过这种方式,您还可以很好地显示哪个容量值属于哪种座位安排。
如果将来可能需要这两个选项,您还可以轻松地将其他字段添加到RoomSeating实体。