сущность symfony: используйте другой атрибут сущности в методе property / to_string

У меня есть объект (продукт), который пользователь может выбрать благодаря типу поля объекта.
Выбранные продукты становятся новым объектом, userIngredient, связанным с продуктами отношением oneToMany (один продукт для многих userIngredients).

Теперь при создании рецепта пользователь должен выбирать только те продукты, которые он добавил в свой список, поэтому я использую построитель запросов для фильтрации продуктов и проверки, есть ли у них соответствующий userIngredient для пользователя.

Это хорошо работает, но я также хочу, чтобы пользователь выбирал продукт по его имени пользователя, а не по имени продукта.
Поэтому мне нужно запросить отношение oneToMany со стороны продукта = со стороны многих. Вот в чем проблема: в сущности продукта я не могу вызвать менеджера сущности.

Мне нужно что-то вроде предустановленного события данных не на родительском объекте, а на реальных продуктах. Как?

    $builder
->add('product', 'genemu_jqueryselect2_entity', array(
'label'=>'Ingrédient',
'multiple' => false,
'required' => false,
'class' => 'AppBundle:MarketPlace\Product',
'property' => 'getUserIngredientName',
'query_builder'=>$this->queryBuilder,
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Choisissez votre ingrédient. Seuls les ingrédients faisant partie de votre sélection aparaissent ici.",
'class' => 'userIngredient select2'
)))

Вот что мне нужно сделать:

Либо в product.php

public function getUserIngredientName()
{
return $this->userIngredients->getName(); //Issue is there is one UserIngredient for every user, I need the one of the current user
}

Или в форме

$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){
$product = $event->getData();
$form = $event->getForm();
//set the property name here but according to a custom value passed to the type
});

0

Решение

Я только что узнал, что новая функция choice_value из этого запроса извлечения позволит мне добиться цели. Затем я мог бы передать свой продукт в функцию и получить соответствующее значение userIngredient для текущего пользователя.

Запрос на извлечение:
https://github.com/symfony/symfony/pull/12148

Пока не знаю, действительно ли это объединено в 2.7. Кто-нибудь знает?

1

Другие решения

После просмотра ваших комментариев я опубликую это решение и посмотрю, работает ли оно для вас. Вы можете просто передать нужную коллекцию самой форме в конструкторе. Вы также можете передать его $options массив, если вы предпочитаете.

контроллер:

// do whatever you need to grab the entities you want
$em = $this->getDoctrine()->getManager();

$productChoices = $em->getRepository('YourBundle:Product')
->getUserIngredients();

// if the form is tied to an entity, pass as the 2nd parameter
$form = $this->createForm(new YourFormType($productChoices));

FormType:

private $productChoices;

public function __construct(array $productChoices)
{
$this->productChoices = $productChoices;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('product', 'genemu_jqueryselect2_entity', array(
'choices' => $this->choices,
// ...
))
;
}
0