奏鸣曲管理员|在表单中创建一对多

时间:2016-02-07 16:49:29

标签: php symfony doctrine-orm sonata-admin sonata

我正在尝试创建的表单有问题而其他主题无法帮助我。这就是我想要做的。

这是数据库方案的一部分:

enter image description here

现在我想创建一个可以创建课程的表单。在那个课程中,我想创建多个会话,我可以添加日期。它应该是这样的:

enter image description here

课程实体中,我有:

/**
 * @ORM\OneToMany(targetEntity="Session", mappedBy="Course")
 */
private $session;

public function getSession()
{
    return $this->session;
}

在我的会话实体中,我有:

/**
 * @var \Studyx\EnrolmentBundle\Entity\Course
 *
 * @ORM\ManyToOne(targetEntity="Studyx\EnrolmentBundle\Entity\Course")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="course_ID", referencedColumnName="ID")
 * })
 */
private $course;

CourseAdmin课程中,我有:

->add('session', 'sonata_type_collection', array(
    'type_options' => array(
        // Prevents the "Delete" option from being displayed
        'delete' => false,
        'delete_options' => array(
            // You may otherwise choose to put the field but hide it
            'type'         => 'hidden',
            // In that case, you need to fill in the options as well
            'type_options' => array(
                'mapped'   => false,
                'required' => false,
            )
        )
    )
), array(
    'edit' => 'inline',
    'inline' => 'table',
    'sortable' => 'position'
))

在我的表单中,我看到“添加新”按钮,但是当我点击它时,我收到错误:

  

属性“session”和方法“addSession()”,“setSession()”,“__ set()”或“__call()”之一都不存在,并且在“Name \ MyBundle \ Entity”类中具有公共访问权限\场”。

我明白了。但是我怎样才能做到这一点呢?我应该将关系更改为多对多还是使用其他字段或......?有人可以帮我这个吗?

更新

SessionAdmin 中,我有:

$formMapper->add('type',      'text',     array('label' => 'Type'));

问题是我真的不知道如何在此管理员表单中结合session_has_date ......

1 个答案:

答案 0 :(得分:2)

由于课程和课程之间存在1..n关系(一门课程包含许多课程)。这意味着Course#getSession()方法没有意义(没有一个会话,有很多会话)。

此外,在表单中添加新会话时,Form组件需要某种方式来添加新会话。包含Course#addSession(Session $session)方法来执行此操作。如果没有这种方法,就无法在课程中添加新课程。