Как отобразить отношение "Много к одному" в раскрывающемся списке формы в 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(). Что я сделал не так?
Спасибо
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 указатель