【问题标题】:Remove already asscoiated values from choice list in sonata admin从奏鸣曲管理员的选择列表中删除已关联的值
【发布时间】:2017-11-14 15:09:20
【问题描述】:

我的奏鸣曲管理包中有一对一的关系。

Person <-> Player. 

如果我去我的个人管理员,我可以从选择列表中选择玩家。

如果我转到另一个 Person 对象,则再次显示播放器(现在已分配)...如果我选择它,则会发生错误...

错误是

更新对象失败:AppBundle\Entity\Person

SQLSTATE[23000]:违反完整性约束:1062 键 'UNIQ_9A5FDF45F6B75B26' 的重复条目 '18'

我可以改变已经赋值的行为没有出现在其他对象中吗?

我在奏鸣曲管理员中找不到执行此操作的选项

【问题讨论】:

  • 向我们提供有关发生错误的更多详细信息
  • 更新了描述...
  • 请提供有关 Person 和 Player 实体以及您的 FormType 的更多详细信息

标签: php symfony sonata-admin


【解决方案1】:

您可以为每个人生成一个自定义选择列表。

将方法添加到 PlayerRepository:

class PlayerRepository extends EntityRepository
{
    public function getNotAssociatedPlayers($person)
    {
        $qb = $this->createQueryBuilder('p')
                   ->leftJoin('p.person', 'prsn')
                   ->where('prsn.id is null');
        if($person !== null)
        {
            $qb->orWhere('prsn.id = :person')
               ->setParameter('person', $person);
        }

        return $qb->getQuery()
                  ->getResult();
    }
}

并在 PersonAdmin 中使用它:

protected function configureFormFields(FormMapper $formMapper)
{
    $person = ($this->getSubject()->getPlayer() !== null)
              ? $this->getSubject()->getId()
              : null;
    $em = $this->getConfigurationPool()->getContainer()->get('doctrine.orm.entity_manager');
    $choices = $em->getRepository('YourBundle:Player')->getNotAssociatedPlayers($person);

    $formMapper
        ->add('player', null, array(
            'choices' => $choices,
        ));

如果出现问题,请告诉我。

编辑:

Documented solution 是该字段的 query_builder 选项:

$formMapper
    ->add('player', null, array(
        'query_builder' => function(EntityRepository $er) 
        {
            $qb = $er->createQueryBuilder('p')
                     ->leftJoin('p.person', 'prsn')
                     ->where('prsn.id is null');
            if($this->getSubject()->getPlayer() !== null)
            {
                $qb->orWhere('prsn.id = :person')
                   ->setParameter('person', $this->getSubject()->getId());
            }
            return $qb;
        }
    ));

【讨论】:

  • 这已经是一个很好的方法了,谢谢!但是有一个问题......如果我以人员形式分配玩家并且网站重新加载,由于现在分配的实体,我的输入框是空的......所以现在我的方法是,在 query_builder 中编写自己的查询formmapper 的属性并选择所有未分配的或分配给我当前人员的那个......如果这在你的方法中的实体中是可能的,我认为它应该更干净。让我知道是否有解决方案。
  • @JimPanse ,我已经更新了我的答案。但我不确定我是否正确理解了你(感谢我的英语不好)。你的意思是这段代码不能按预期工作吗?还是您需要更优雅的解决方案?
  • @JimPanse ,哦,我想我现在已经理解你了。请再看一下我的第一种方法。当我们定义 $person 变量时,我们检查当前 Person 是否与 Player 关联。如果需要,我们在 PlayerRepository 中添加 orWhere 子句。关于这个?
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2018-04-30
  • 2020-08-12
  • 2012-01-07
  • 2017-11-12
  • 2018-03-22
相关资源
最近更新 更多