1

我正在使用 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';
    }
}
4

1 回答 1

0

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

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

  1. “静态”选择制造商,不要在请求期间更改它:使用从业务逻辑中检索到的数据
  2. “动态地”选择制造商,并且可以在请求时更改它们:在每次请求时替换您的表格;新表单将由业务逻辑提供

所以,的问题的核心是:我怎样才能只检索关联的实体?

回答

进入您的 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

于 2013-03-08T10:02:27.887 回答