Symfony2形成一对多对多关系的持久性

时间:2015-02-18 12:07:48

标签: php forms symfony doctrine-orm many-to-many

我有一对多的结构,如下所示:(下面的代码)
房间(id,...,roomSeatings)
RoomSeating(身份证,房间,座位,容量
座位(id,...,roomSeatings)
座位意味着座位放置在房间内,即:U形

我的目标是生成一个表格: 房间信息(完)
房间的座位信息(带座位的复选框,您可以选择哪些座位可用于房间及以下,每个座位,您输入最大容量的文本字段每个座位。)
Output sample

我不想将关系实体预先填入所有可能的房间+座位组合,因为这绝对不能很好地扩展 (例如:对于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;

1 个答案:

答案 0 :(得分:1)

您没有编辑"座位"实体,它只是RoomSeating的一个属性中的可能选择。

最好的解决方案可能是将Room作为您正在编辑的主要实体,将RoomSeating作为嵌入式表单。 见http://symfony.com/doc/master/cookbook/form/form_collections.html 该文档还解释了如何添加/删除记录。

唯一剩下的就是如何在网页的界面中使用它。

你可以调整它以使"添加座位" - 按钮添加一行"用户还必须选择座位。这将是最简单和最标准的Symfony2实现。

或者您可以使用实际表单之外的复选框来触发创建/删除"行"在嵌入式表单中使用javascript。 通过这种方式,您还可以很好地显示哪个容量值属于哪种座位安排。

如果将来可能需要这两个选项,您还可以轻松地将其他字段添加到RoomSeating实体。