【问题标题】:Symfony 2, how to persist join table entities?Symfony 2,如何持久化连接表实体?
【发布时间】:2016-06-10 20:59:30
【问题描述】:

这是一个如此微不足道的问题,我不敢相信我找不到答案。

Symfony 2,学说 2.1。我有两个实体和一个中间实体(连接表)。用户、首选项和用户首选项。 Pref 表是字典表,所以我只能在一个地方更改 pref 名称。好的,我们看图:

infographic http://dl.dropbox.com/u/22495762/infographic.png

如您所见,我想要一个复选框组,检查所有可能的选项(首选项)和首选选项。因此,如果有 3 个首选项,而用户只选择了 2 个,则应该有 3 个复选框,其中 2 个被选中。

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

但是为了上帝的生命,我无法使用 symfony 和教义来实现它。我能够更新理论和数据库中的关系,但我使用的是原始查询值:

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

这不是应该的方式吗?

Morevoer,我完全不知道应该如何显示复选框列表。我要么得到所有选项的列表,没有选中,要么只得到用户选项,全部选中。或者在所有情况下都带有复选框的“左连接”结果集,无论如何都没用。

我已经到了尝试重载 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);
}

并根据 id 在教义中设置实际关联:

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

这里我将实体管理器传递给实体本身,但我需要重构它,因为这样看起来有点乱。

然后$em->flush(); 就是这样。

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

【问题讨论】:

    标签: symfony left-join checkbox


    【解决方案1】:

    您需要选择字段类型: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);
    

    编辑:对不起,我弄错了,您需要“实体”类型,它会自动从数据库中获取选项:http://symfony.com/doc/current/reference/forms/types/entity.html

    您仍然必须放置多个 => true 扩展 => true 才能获得复选框。

    【讨论】:

    • 我在表单类中尝试了实体类型、选择类型、查询构建器......我只是无法从数据库中获取我需要的内容,单独的复选框不是问题。
    • 我不明白你的问题了。 ->add('prefs', 'entity', array( 'class' => 'Some\TestBundle\Entity\Pref', 'expanded' => 'true', 'multiple' => 'true', 'property' => 'name' )) 应该可以了,有什么问题?
    猜你喜欢
    • 2016-04-13
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2018-02-10
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多