5

当我需要显示汽车与其品牌之间的 OneToMany 关系时,我有一个表格。

当我现在点击下拉菜单时,我只能看到车名。因为它是从汽车实体自动创建的。

我希望在下拉列表中看到的是 NameOfTheCar - NameOfTheBrand。对于每一个选择

我有一个像这样的 CarType:

$builder->add('cars', 'choice', array(
        'choices'   => array(
            'Test' => 'Example',
        ),
        'required'  => true,
    ));

我怎样才能做到这一点 ?

编辑:我听从了雨果的建议。

现在我得到了

$builder->add('lake', 'entity', array(
            'class'     =>  'Pondip\KeepnetBundle\Entity\CatchReport',
            'required'  => true,
        ));

而我的 __toString 的 CatchReport 是

  public function __toString()
    {
        return $this->car .' - '. $this->car->getBrand();
    }

当湖是

/**
 * @var integer
 *
 * @ORM\ManyToOne(targetEntity="Pondip\CarBundle\Entity\Car")
 * @ORM\JoinColumn(name="car_id", referencedColumnName="id")
 * @Assert\NotBlank()
 */
private $car;

在我的品牌实体中,我有:

 /**
     * @var integer
     * @Assert\Type(type="Pondip\CarBundle\Entity\Brand")
     * 
     * @ORM\ManyToOne(targetEntity="Pondip\CarBundle\Entity\Brand")
     * @ORM\JoinColumn(name="brand_id", referencedColumnName="id")
     */
    private $brand;

现在我的 toString() 函数出现错误。我做错了什么 ?

谢谢

4

1 回答 1

9

这样做的好方法是使用“实体”类型,解决整个问题有两个主要步骤。

第一步

$builder->add('cars', 'entity', array(
        'class' => 'MyBundle:Car',

        // 'property' => 'myCustom', -- The default is the __toString() (Enity file)

        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('c')
                ; // You can add anything else here or
                  // use an existing function of the repository file
    ),
    'required'  => true,
));

通常,您可以将键设置property为要使用的对象的属性,但在您的情况下,由于它有点复杂,您将不得不覆盖该__toString()方法或在返回值和 set 的对象上创建一个自定义属性property => 'myCustom'

第二步:

在您的实体文件中,它不是存储库文件,而是 Cars.php 文件(具有 getter 设置器)。这是用于与 的映射property

  • 第一: 覆盖 toString

    function __toString(){
        return $this->name . " - ". $this->brand;
    }
    
  • 二: 制作自定义方法

    function getMyCustom(){
        return $this->name . " - ". $this->brand;
    }
    

可选的

对于query_builder领域。
如果检索汽车的查询很复杂,您可能希望在汽车存储库中创建自定义方法。为了在构建器中进行尽可能简单的查询。这是为了检索将填充下拉列表的汽车列表。如果您只想检索所有汽车,您只需指定->findAll().


更新

你的 __toString 的问题似乎是它不能调用函数(我不知道为什么)。试试这个:

function __toString(){ // CatchReport
    return $this->car

}

function __toString(){ // Car
    return $this->name . " - " . $this->brand

}

function __toString(){ // Brand
    return $this->name

}

这样它永远不会使用对象,因此不能在空指针上返回异常

于 2013-04-20T20:17:19.503 回答