繁体   English   中英

基于其他实体的Symfony2表单填充实体

[英]Symfony2 form populating entitiy based on other entity

我正在使用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. “静态”选择制造商,并且在请求期间不要更改:使用从您的业务逻辑中检索到的数据
  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检索正确的模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM