Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony SonataAdmin$formMapper->;add()实体筛选_Symfony_Doctrine_Sonata Admin - Fatal编程技术网

Symfony SonataAdmin$formMapper->;add()实体筛选

Symfony SonataAdmin$formMapper->;add()实体筛选,symfony,doctrine,sonata-admin,Symfony,Doctrine,Sonata Admin,我有两个实体:Worker和User。我在他们之间建立了一对一的关系: class Worker { ... /** * @ORM\OneToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="worker") */ protected $user; ... } class User extends BaseUser { ...

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

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创建了用于编辑worker的页面。在那里,我使用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');
    }
}
此代码为“用户”字段生成下一个html代码:

<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>

测试
测试2
现在,如果我试图编辑另一个worker,我希望它不会显示已经连接到其他worker的用户。我怎么做


我对Symfony非常陌生,所以如果我上面写的不是详尽的信息,请询问。

尝试此操作我得到了一个错误:DQL查询中不支持反向端的单值关联路径表达式。使用显式连接。几乎正确,但问题很少。首先,我必须使用
join('MyBundle\Entity\Worker','w')
或者我得到了错误(未知类或其他东西)。其次,所描述的关系将字段
user\u id
添加到Worker表,而不向user表添加任何内容。所以我不能使用
where('w为null')
。我可以使用
where('w.user is null')
,但它也不正确,因为如果至少有一个worker未连接到用户,它将返回所有用户,否则它将不返回任何内容。但我希望它只选择未在Worker表中列出的用户。清楚吗?还是我应该再解释一遍?关于第一个问题,我忘了放别名(已编辑)。“我不确定我是否理解第二个,”德维修斯说,“我理解他。他搞乱了条令关系和DB关系。在原则中,所有连接都存储在对象本身中,当您在DQL中执行类似于“从AcmeUserBundle中选择u:User u JOIN u.worker w,其中w为NULL”的操作时,您将在SQL中从用户u LEFT JOIN workers w ON u.id=w.User_id,其中w.User_id为NULL中选择[字段列表]。条令知道如何纠正SQL代码。找到了解决方案。应该使用leftJoin()而不是join()。编辑你的答案。谢谢你的帮助。
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');
                }));
    }
}