SonataAdmin $ formMapper-> add()实体过滤

时间:2014-12-02 10:36:21

标签: symfony doctrine sonata-admin

我有两个实体:WorkerUser。我在他们之间建立了一对一的关系:

class Worker
{    
    ...

    /**
     * @ORM\OneToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="worker")
     */
    protected $user;

    ...
}

class User extends BaseUser
{
    ...

    /**
     * @ORM\OneToOne(targetEntity="Luny\SiteBundle\Entity\Worker", mappedBy="user")
     */
    protected $worker;

    ...
}

现在,使用SonataAdminBundle我创建了编辑工作者的页面。在那里我使用FormMapper来创建表单。它看起来像这样:

class WorkerAdmin extends Admin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('fname', 'text', array('label' => 'First Name'))
            ->add('lname', 'text', array('label' => 'Last Name'))
            ->add('user');
    }
}

此代码为'user'字段生成下一个html-code:

<select id="s547d83b883c77_user" name="s547d83b883c77[user]" class="select2-offscreen" tabindex="-1" title="User">
    <option value=""></option>
    <option value="2">test</option>
    <option value="1" selected="selected">test2</option>
</select>

现在,如果我尝试编辑另一个工作者,我希望它不显示已经连接到其他工作者的用户。我该怎么办?

我是Symfony的新手,所以如果我上面写的都不是详尽的信息,那就问问。

1 个答案:

答案 0 :(得分:1)

class WorkerAdmin extends Admin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('fname', 'text', array('label' => 'First Name'))
            ->add('lname', 'text', array('label' => 'Last Name'))
            ->add('User', null, array(
                'class' => 'Application\Sonata\UserBundle\Entity\User',
                'query_builder' => function($repository) {
                    return $repository->createQueryBuilder('u')
                            ->leftJoin('u.worker', 'w')
                            ->where('w is null');
                }));
    }
}