Symfony 2,如何持久化联接表实体?

Symfony 2,如何持久化联接表实体?,symfony,left-join,checkbox,Symfony,Left Join,Checkbox,这是一个如此琐碎的问题,我简直不敢相信我找不到答案 Symfony 2,条令2.1。我有两个实体和一个中间实体(联接表)。User、Pref和UsersPrefs。Pref表是字典表,所以我只能在一个地方更改Pref名称。好,我们来看图片: 如您所见,我希望有一个复选框组,选中所有可能的选项(pref)和首选选项。因此,如果有3个Pref,并且用户只选择了2个Pref,那么应该有3个复选框,2个selected 这很简单,如果执行两次普通PHP查询数据库以获取所有Pref和用户Pref的列表,

这是一个如此琐碎的问题,我简直不敢相信我找不到答案

Symfony 2,条令2.1。我有两个实体和一个中间实体(联接表)。User、Pref和UsersPrefs。Pref表是字典表,所以我只能在一个地方更改Pref名称。好,我们来看图片:

如您所见,我希望有一个复选框组,选中所有可能的选项(pref)和首选选项。因此,如果有3个Pref,并且用户只选择了2个Pref,那么应该有3个复选框,2个selected

这很简单,如果执行两次普通PHP查询数据库以获取所有Pref和用户Pref的列表,根据值呈现复选框,添加一些操作以处理表单提交,完成

但看在上帝的份上,我不能用symfony&document来实现这一点。我能够在条令和数据库中更新关系,但我使用原始查询值:

$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\u id
数组。现在我只需要根据用户选择的首选项设置数组中的值:

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()就是这样


这是我能想到的最好的了。可能它过于复杂,应该以完全不同的方式来完成。不幸的是,无法找到此“其他方式”。

您需要选择字段类型:

在构建器中,它将类似于

$builder->add('prefs', 'choice', array('multiple' => true, 'expanded' => true, 'choices' => fetch the available prefs from the database here);
编辑:对不起,我弄错了,您需要“实体”类型,它会自动从数据库中获取选项:


您仍然必须输入multiple=>true expanded=>true以获取复选框。

您需要选择字段类型:

在构建器中,它将类似于

$builder->add('prefs', 'choice', array('multiple' => true, 'expanded' => true, 'choices' => fetch the available prefs from the database here);
编辑:对不起,我弄错了,您需要“实体”类型,它会自动从数据库中获取选项:


您仍然必须放入multiple=>true expanded=>true以获取复选框。

我在表单类中尝试了enity类型、choice类型、query bulider。。。我只是无法从数据库中获取所需的内容,复选框本身并不是问题。我不再理解您的问题<代码>->add('prefs','entity',array('class'=>'Some\TestBundle\entity\Pref','expanded'=>'true','multiple'=>'true','property'=>'name'))
应该可以工作,有什么问题吗?我在表单类中尝试了enity类型、choice类型、query bulider。。。我只是无法从数据库中获取所需的内容,复选框本身并不是问题。我不再理解您的问题<代码>->add('prefs','entity',array('class'=>'Some\TestBundle\entity\Pref','expanded'=>'true','multiple'=>'true','property'=>'name'))应该可以工作,有什么问题吗?