Как отобразить отношение "Много к одному" в раскрывающемся списке формы в Symfony2?


У меня есть форма, когда мне нужно отобразить связь между, скажем, автомобилем и его маркой.

Когда я сейчас нажимаю на раскрывающийся список, я вижу только название автомобиля. так как он автоматически создается из сущности car.

То, что я хотел бы видеть в своем выпадающем списке, - это имя автомобиля - Имя бренда. Для каждого выбора

У меня есть тип карты с таким файлом, как:

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

Как я могу это сделать?

РЕДАКТИРОВАТЬ: Я следовал советам Хьюго.

Теперь у меня есть

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

И моя __Строка 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(). Что я сделал не так?

Спасибо

Author: Miles M., 2013-04-20

1 answers

Хороший способ сделать это - использовать тип "сущность", и для решения всего этого есть 2 основных шага.

Первый шаг

$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 файл (в котором есть установщики геттера). Это для сопоставления с property.

  • Первый: переопределение строки TO

    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

}

Таким образом, он никогда не использует объект и, следовательно, не может возвращать исключение при null указатель

 9
Author: Hugo Dozois, 2013-04-20 21:26:57