Symfony - Как удалить конкретный элемент из моего массива из сущности - PullRequest
0 голосов
/ 25 марта 2019

У меня есть сущность Packages (manyToMany с entityTypeUser, который создает меня в БД сущность package_des_users). Таким образом, сущность My Packages содержит массив TypeUser (поскольку пакет может быть назначен нескольким типам пользователей).

Я хочу иметь возможность удалить один из элементов, которые являются частью массива TypeUser одного из моих пакетов.

Мой план действий был:

  1. Получить пакет для обработки
  2. Получите имя TypeUser для удаления из массива TypeUser пакета.
  3. Выполните проверку: если пакет содержит только одного пользователя типа, пакет будет удален напрямую. Если он содержит более одного, просто удалите выбранного пользователя типа.

На данный момент мне удалось восстановить обрабатываемый пакет, а также имя удаляемого 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');

Функция моего объекта (paquet):


    /**  
     * @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 моего пакет. Затем это переводится в базу данных.

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Я обновил свой код:

    /**
 * 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();

Теперь все в порядке! Спасибо

0 голосов
/ 25 марта 2019

Вы должны изменить его в классе, вы вызываете свойство $ 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');
    }

«Catchable Fatal Error: Аргумент 1 передан Site \ PagesBundle \ Entity \ Paquet :: deleteTypeFromTypesUser() должен быть экземпляром Site \ PagesBundle \ Entity \ TypeUser, массив указан «ошибка из-за поиска, возвращающего массив.Вы должны изменить этот метод.Если вам нужна помощь, покажите код, пожалуйста.

...