我正在运行Symfony 3.4 LTS。在我的实体中,我得到了:
在ProductEntity中:
/**
* @var array
*
* @ORM\Column(name="experts", type="simple_array")
*/
private $experts;
例如,数据库中的experts
列可能是[2,7,9],其中#2,#7和#9以及被视为相关产品专家的用户ID。在我的ProductForm中:
$builder->add('experts', EntityType::class, array(
'class' => 'AppBundle:User',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.username', 'ASC')
->andWhere('u.active = 1')
},
'choice_label' => function($user) {
return $user->getFirstname();
}
));
我不想建立ManyToMany关系,因为我不想另一个SQL表。该表单在前端显示良好,访问者可以在HTML列表中选择一个或多个用户。但是用户#2,#7和#9 默认情况下未选择。
生成的select
列表看起来不错,ID好:
<select>
<option value="1">John</option>
<option value="2">Matthew</option>
<option value="3">Brad</option>
<option value="4">Georges</option>
<option value="5">Luke</option>
...
</select>
如何在用户列表(由createQueryBuilder()
生成)和数据库中存储的用户ID数组之间建立映射?
我认为您需要配置choice_value
选项以返回实体ID。 EntityType的默认选择值为实体对象,但您只需要id。
'choice_value' => function (?UserEntity $user) {
return $user ? $user->getId() : '';
},
https://symfony.com/doc/3.4/reference/forms/types/entity.html#choice-value