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');
}));
}
}