#symfony #collections #entity
#symfony #Коллекции #сущность
Вопрос:
У меня есть отношения «много ко многим» (пользователь, устройства), затем в user у меня есть ноль или больше устройств в коллекции. Затем у меня есть форма пользователя с полем entitytype устройства, в котором отображаются все возможные устройства. Пока здесь все работает нормально.
Теперь мне нужно отредактировать user, затем в поле device entitytype мне нужно показать все возможные устройства и выделить текущие сохраненные устройства. Например, если у меня есть устройство 1,2,3,4,5, а параметры 2,3 — это текущие значения, которые мне нужно показать 1,2,3,4,5 с выбранным 2,3 (выделено).
Теперь, когда я получаю объект user, у него есть коллекции с сохраненными устройствами, но в поле device сохраненные устройства не выбраны (выделены).
Это мой контроллер (Пользователь = Usuario, Драйвер = Dispositivo):
<?php
namespace AppController;
use AppEntityUsuario;
use AppFormUsuarioType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;
/**
* @Route("/usu")
*/
class UsuarioController extends AbstractController
{
/**
* @Route("/{id}/edit", name="usuario_edit", methods={"GET","POST"})
*/
public function edit(Request $request, $id): Response
{
$entityManager = $this->getDoctrine()->getManager();
$usuario = $entityManager->getRepository(Usuario::class)->find($id);
//dd($usuario);
$form = $this->createForm(UsuarioType::class, $usuario );
$form->handleRequest($request);
if ($form->isSubmitted() amp;amp; $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('usuario_index');
}
return $this->render('usuario/edit.html.twig', [
'usuario' => $usuario,
'form' => $form->createView(),
]);
}
}
Это мои значения пользовательских сущностей (вариант 2 находится в коллекциях):
UsuarioController.php on line 49:
AppEntityUsuario {#670 ▼
-id: 1
-id_usuario_k: 1
-id_usuario_a: 1
-dispositivos: DoctrineORMPersistentCollection {#690 ▼
-snapshot: array:1 [ …1]
-owner: AppEntityUsuario {#670}
-association: array:19 [ …19]
-em: DoctrineORMEntityManager {#566 …11}
-backRefFieldName: "usuarios"
-typeClass: DoctrineORMMappingClassMetadata {#673 …}
-isDirty: false
#collection: DoctrineCommonCollectionsArrayCollection {#692 ▼
-elements: array:1 [▼
0 => AppEntityDispositivos {#703 ▼
-id: 2
-descripcion: "Disp2"
-usuarios: DoctrineORMPersistentCollection {#705 ▶}
}
]
}
#initialized: true
}
}
Это мой объект User (Usuario= User dispositivo= Драйвер)
<?php
namespace AppEntity;
use AppRepositoryUsuarioRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass=UsuarioRepository::class)
*/
class Usuario
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="integer")
*/
private $id_usuario_k;
/**
* @ORMColumn(type="integer")
*/
private $id_usuario_a;
/**
* @ORMManyToMany(targetEntity="Dispositivos", inversedBy="usuarios", fetch="EAGER")
* @ORMJoinTable(name="UsuDisp",
* joinColumns={@ORMJoinColumn(name="usuario_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="dispositivo_id", referencedColumnName="id")}
* )
*/
private $dispositivos;
public function __construct()
{
$this->dispositivos = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getIdUsuarioK(): ?int
{
return $this->id_usuario_k;
}
public function setIdUsuarioK(int $id_usuario_k): self
{
$this->id_usuario_k = $id_usuario_k;
return $this;
}
public function getIdUsuarioA(): ?int
{
return $this->id_usuario_a;
}
public function setIdUsuarioA(int $id_usuario_a): self
{
$this->id_usuario_a = $id_usuario_a;
return $this;
}
/**
* @return Collection|Dispositivos[]
*/
public function getDispositivos(): Collection
{
return $this->dispositivos;
}
public function setDispositivos(ArrayCollection $dispositivos)
{
$this->dispositivos = $dispositivos;
return $this;
}
public function addDispositivo(Dispositivo $dispositivo): self
{
if (!$this->dispositivos->contains($dispositivo)) {
$this->dispositivos[] = $dispositivo;
}
return $this;
}
public function removeDispositivo(Dispositivo $dispositivo): self
{
if ($this->dispositivos->contains($dispositivo)) {
$this->dispositivos->removeElement($dispositivo);
$dispositivo->removeGroupe($this);
}
return $this;
}
}
Это мой код формы:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('Drivers', EntityType::class, [
'class' => Driver::Class,
'choice_label' => 'description',
'placeholder' => 'Select a device',
'multiple' => true,
'empty_data' => '',
]);
}
Это мой экран (опция 2 сохранена):
Я буду признателен за некоторую помощь.
Комментарии:
1. Есть ли у вас свойство с именем
'Drivers'
или методы с именемgetDrivers
,addDriver
, amp;removeDriver
? Если да, пожалуйста, дополните свой вопрос. Также, пожалуйста, скопируйте и вставьте свой дамп, это будет гораздо полезнее, чем использование изображения текста.2. Вы также должны добавить свой код для метода контроллера, обрабатывающего форму.
3. Я добавил контроллер и код объекта. Это на испанском языке, в моем первоначальном вопросе я перевожу usuario = пользователь и dispositivo = водитель.
Ответ №1:
РЕШАЕМАЯ
Я должен добавить choice_value=’descripcion’, то же самое, что и choice_label.
Я не знаю почему, что symfony делает внутри компании?