使用 Symfony 和 Doctrine 持久保存连接表实体的更简单方法

问题描述 投票:0回答:1

在 Symfony 2 和 Doctrine 2.1 中,我有两个实体和一个中间实体(连接表):User、Pref 和 UsersPrefs。 Table Pref 是一个字典表,因此我只能在一个地方更改 pref 名称。

信息图http://dl.dropbox.com/u/22495762/infographic.png

我想要一个复选框组,其中选中了所有可能的选择(首选项)和首选选项。如果有 3 个首选项,并且用户选择了 2 个,则应该有 3 个复选框,其中选择了 2 个。

如果用纯 PHP 完成:查询数据库两次以获取所有首选项和用户首选项的列表,根据值呈现复选框,并添加一些操作来处理表单提交。

但是我无法使用 Symfony 和 Doctrine 让它工作。我可以更新 Doctrine 和数据库中的关系,但使用原始查询:

$data = $request->request->get('some_form');

这应该不是应该做的事情。

我对如何显示复选框列表感到困惑。我要么得到所有选项的列表,没有选中,要么只有用户选项,全部选中,或者带有所有选项复选框的左连接结果。

我尝试重载 twig 复选框模板,但无法将变量传递到表单模板。

这会得到一组复选框,与用户选择无关:

->add('prefs', 'entity', array(
            'class' => 'Some\TestBundle\Entity\Pref',
            'expanded' => 'true',
            'multiple' => 'true',
            'property' => 'name'                        
            ))

这仅获取用户选择,全部选中:

->add('prefs', 'entity', array(
            'class' => 'Some\TestBundle\Entity\UserPrefs',
            'multiple' => 'false',
            'expanded' => 'false',
            'property' => 'pref.name',
            'query_builder' => function(EntityRepository $er) use ($id) {
                                    return $er->createQueryBuilder('u')
                                        ->where("u.user = :id")
                                        ->setParameter('id', $id)
                                    ;
                                },
        
        ))

我尝试了左连接和其他选项,但最多我只能得到所有可能用户的所有可能选项的列表,并进行相应检查。

这样我就可以选中适当的复选框:

这将显示一个复选框组:

->add('pref_ids', 'choice', array(
        'choices'   => array(
            '1'   => 'pref one',
            '2' => 'pref two',
            '3'   => 'pref three',
        ),
        'expanded' => 'true',
        'multiple' => 'true'                       
        ))

我在用户实体中添加了数组

$pref_ids

然后我根据用户选择的偏好设置数组中的值:

public function setPrefIds()
  {
    $prefs = $this->getPrefs();
    $this->pref_ids = array();
    foreach($prefs as $pref){
        array_push($this->pref_ids, $pref->getPref()->getId());
    }
    return $this;
  }

将值写入数据库是该过程的逆过程。我从以下位置获取输入值:

$data = $request->request->get('edit_form');
var_dump($data['pref_ids']);

删除所有用户首选项:

foreach ($userPrefs as $pref){
$em->remove($pref);
}

从 ids 设置教义中的实际关联:

$entity->setPrefsById($em, $data['pref_ids']);

我将实体管理器传递给实体本身,但我需要重构它,因为它很乱。

然后:

$em->flush();

有什么更简单的方法吗?

php symfony checkbox left-join
1个回答
0
投票

您需要选择字段类型:http://symfony.com/doc/current/reference/forms/types/choice.html

在你的构建器中,它会是这样的

$builder->add('prefs', 'choice', array('multiple' => true, 'expanded' => true, 'choices' => fetch the available prefs from the database here);

编辑:抱歉我错了,您需要“Entity”类型,它会自动从数据库中获取选择:http://symfony.com/doc/current/reference/forms/types/entity.html

您仍然必须放置多个 => true Expanded => true 才能获取复选框。

© www.soinside.com 2019 - 2024. All rights reserved.