【问题标题】:How to display a Many to One Relation in a form dropdown in Symfony2?如何在 Symfony2 的表单下拉列表中显示多对一关系?
【发布时间】:2013-04-20 19:29:18
【问题描述】:

当我需要显示汽车与其品牌之间的 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,
        ));

而我的 CatchReport 的 __toString 是

  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() 函数出现错误。我做错了什么?

谢谢

【问题讨论】:

  • __toString 错误是什么?我认为错误是因为 $this->car 正在返回一个对象。不应该是 $this->car->getName()
  • 致命错误:方法 Pondip\KeepnetBundle\Entity\Catchreport::__toString() 不得在...中抛出异常
  • 尝试制作一个真正简单的 __tostring (ex : return "test";) 方法首先测试它是否有效。如果确实添加了第二部分,则添加第一部分(检查它是否有效)。
  • 我试过了,也没有任何结果:return $this->car->getName() 。 - '。 $this->car->getBrand()->getName();
  • 是的,当返回 $this->car 时。 - '。 $这个->汽车;它有效

标签: php forms symfony drop-down-menu one-to-many


【解决方案1】:

最好的方法是使用'entity' 类型,解决整个问题有两个主要步骤。

第一步

$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() 方法或在其上创建自定义属性返回值并设置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

}

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

【讨论】:

  • 感谢 Hugo,所以 getMyCustom() 应该在汽车存储库中?
  • @MilesM。该属性的功能(出现在下拉列表中的文本)应该在实体中。获取特定汽车集(如果需要)的查询应该在 repo 中
  • @Hugp:所以在我的汽车实体文件中,我应该有public function getNameCarsBrand(){ return $this->getName().' - '.$this->brand->getName() ;}
  • @MilesM。我已经为你的 toString 更新了我不知道这是否是问题,但也许会解决它。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
相关资源
最近更新 更多