У меня есть объект Packages (manyToMany с entityTypeUser, который создает мне в БД объект package_des_users). Таким образом, сущность My Packages содержит массив TypeUser (поскольку пакет может быть назначен нескольким типам пользователей).
Я хочу иметь возможность удалить один из элементов, являющихся частью массива TypeUser одного из моих пакетов.
Мой план действий был таким:
На данный момент я смог восстановить пакет для обработки, а также имя TypeUser для удаления и номер TypeUser, который содержал мой пакет. Если он содержит только один, он хорошо его подавляет. Проблема остается для другого случая.
Будучи новичком в Symfony 3.4, мне трудно понять, как это сделать правильно.
Моя функция controller.php:
/**
* Deletes a paquet entity.
*
* @Route("/{id}/{type}/delete", name = "paquets_delete")
*/
public function deleteAction(Request $request, $id, $type)
{
$em = $this->getDoctrine()->getManager();
$unPaquet = $em->getRepository('PagesBundle:Paquet')->find($id);
$nbTypes = count($unPaquet->getTypeUser());
if ($nbTypes == 1)
{
$em->remove($unPaquet);
}
else
{
$am = $this->getDoctrine()->getManager();
$leType = $am->getRepository('PagesBundle:TypeUser')
->findByTypeUtilisateur($type);
$em->$unPaquet->deleteTypeFromTypesUser($leType);
}
$em->flush();
return $this->redirectToRoute('paquets_index');
Функция моей сущности (пакета):
/**
* @var \Doctrine\Common\Collections\Collection
* @ORM\ManyToMany(targetEntity = "TypeUser")
* @ORM\JoinTable(name = "Packages_des_TypesUser")
* @ORM\JoinColumn(nullable=false)
*/
private $typeUser;
public function __construct()
{
$this->typeUser = new ArrayCollection();
}
/**
* Get TypeUser
*
* @return Site\PagesBundle\Entity\TypeUser
*/
public function getTypeUser()
{
return $this->typeUser;
}
public function deleteTypeFromTypesUser(TypeUser $type)
{
$this->typeUser->removeElement($type);
}
Поэтому я хотел бы иметь возможность получить соответствующий объект TypeUser (результат будет уникальным) из контроллера, чтобы я мог передать его в качестве параметра функции, которая позаботится об удалении его из массива TypeUser моего пакета. Затем это переводится в базу данных.
Спасибо за вашу помощь !
Да, именно этого я и желаю, если останется только один тип. Оно работает. Но если их несколько, я хочу, чтобы он просто удалил typeUser, переданный в качестве параметра.
Затем измените это: $em->$unPaquet->deleteTypeFromTypesUser($leType); в $unPaquet->deleteTypeFromTypesUser($leType);
Да, это хорошо. Теперь у меня есть новая ошибка: Catchable Fatal Error: аргумент 1, переданный Site\PagesBundle\Entity\Paquet::deleteTypeFromTypesUser(), должен быть экземпляром Site\PagesBundle\Entity\TypeUser, данный массив, вызывается в /usr/ local/apache/preprod_8080/htdocs/alatech/src/Site/PagesBundle/Controller/PaquetController.php в строке 146 и определено. Я должен написать тип моей переменной в строке: $unPaquet->deleteTypeFromTypesUser($ ЛеТип);
Проверьте мой ответ.






Вы должны изменить его в классе, вы вызываете свойство $unPaquet менеджера сущностей, а затем вызываете функцию, которой не существует. Также вы забыли проверить, есть ли более одного, иначе вы будете удалять из пустого массива.
/**
* Deletes a paquet entity.
*
* @Route("/{id}/{type}/delete", name = "paquets_delete")
*/
public function deleteAction(Request $request, $id, $type)
{
$em = $this->getDoctrine()->getManager();
$unPaquet = $em->getRepository('PagesBundle:Paquet')->find($id);
$nbTypes = count($unPaquet->getTypeUser());
if ($nbTypes == 1)
{
$em->remove($unPaquet);
}
else if ( $nbTypes > 1 )
{
$leType = $em->getRepository('PagesBundle:TypeUser')
->findByTypeUtilisateur($type);
$unPaquet->deleteTypeFromTypesUser($leType);
}
$em->flush();
return $this->redirectToRoute('paquets_index');
}
«Уловимая неустранимая ошибка: аргумент 1, переданный в Site\PagesBundle\Entity\Paquet::deleteTypeFromTypesUser(), должен быть экземпляром Site\PagesBundle\Entity\TypeUser, указанный массив», ошибка связана с тем, что поиск возвращает массив. Вы должны изменить этот метод. Если вам нужна помощь, покажите код, пожалуйста.
Я обновил свой код:
/**
* Deletes a paquet entity.
*
* @Route("/{id}/{type}/delete", name = "paquets_delete")
*/
public function deleteAction(Request $request, $id, $type)
{
$em = $this->getDoctrine()->getManager();
$unPaquet = $em->getRepository('PagesBundle:Paquet')->find($id);
$nbTypes = count($unPaquet->getTypeUser());
if ($nbTypes == 1)
{
$em->remove($unPaquet);
}
else if ($nbTypes > 1)
{
$am = $this->getDoctrine()->getManager();
$leType = $am->getRepository('PagesBundle:TypeUser')-
>findByTypeUtilisateur($type);
$unPaquet->deleteTypeFromTypesUser($leType[0]);
}
$em->flush();
Теперь все в порядке! Спасибо
Пожалуйста. Примите мой ответ, если вы нашли его полезным, пожалуйста.
Ваш код удаляет сам пакет, если есть 1 тип.