Symfony2基于另一个实体形成填充实体

时间:2013-03-07 20:52:19

标签: forms symfony

我正在使用Symfony2表单组件来创建和修改表单。我目前正在加载所有模型实体作为选择,但我只需要获取与制造商所选(已发布)值相关的模型。

我怎样才能做到这一点?

class VehicleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('manufacturer', 'entity', array(
            'label' => 'Brand',
            'attr' => array('class' => 'input-block-level'),
            'class' => 'BalslevCarBundle:Manufacturers',
            'property' => 'short_name',
            'empty_value' => 'All',
            'required' => false
        ));
        $builder->add('model', 'entity', array(
            'label' => 'Model',
            'class' => 'BalslevCarBundle:Models',
            'property' => 'model',
            'empty_value' => 'All',
            'required' => false
        ));
    }

    public function getName()
    {
        return 'search';
    }
}

1 个答案:

答案 0 :(得分:0)

首先,您必须根据用户选择“动态”创建您的选择 有两种方法,严格地与您的应用程序行为相结合,导致(在两种情况下)相同的“核心”代码;区别仅在于你的称呼方式。

所以,让我们解释两种可能性:

  1. 选择制造商“静态”并且不要在请求时更改它:使用从业务逻辑中检索到的数据
  2. 选择制造商“dinamically”并可以在请求时更改它们:在每次请求时更换您的表格;新表格将由商业逻辑提供
  3. 因此,您问题的 HEART 是:我如何只检索关联的实体?

    答案

    进入你的VehicleType.php(实体,在这种情况下,是VehicleType?)

    private $manufacturerId;
    
    public function __construct($manufacturerId)
    {
        $this->manufacturerId = $manufacturerId;
    }
    
    public function BuildForm(FormBuilderInterface $builder)
    {
        $manufacturerId = $this->manufacturerId;
    
        $manufacturerQuery = function(EntityRepository $repo) use ($manufacturerId ){
                                  return $repo->createQueryBuilder('m')
                                              ->where('m.id = :id')
                                              ->setParameter('id',$manufacturerId );};
    
        $builder->add('manufacturer', 'entity', array(
            'label' => 'Brand',
            'attr' => array('class' => 'input-block-level'),
            'class' => 'BalslevCarBundle:Manufacturers',
            'property' => 'short_name',
            'empty_value' => 'All',
            'required' => false,
            'query_builder' => $manufacturerQuery;
        ));
    
        $builder->add('model', 'entity', array(
            'label' => 'Brand',
            'attr' => array('class' => 'input-block-level'),
            'class' => 'BalslevCarBundle:Manufacturers',
            'property' => 'short_name',
            'empty_value' => 'All',
            'required' => false,
            'query_builder' => $modelQuery;
        ));
    }
    

    正如您所看到的,通过这种方式,我们使用自定义存储库来仅获取适合我们需求的实体。显然,我在不知道你的数据库结构的情况下编写我的DQL查询:根据你的实际情况调整它是你的任务和责任。

    此外,您必须为模型创建另一个查询(在我的答案中称为$modelQuery),以根据选定的$id

    检索正确的模型