Symfony - Как удалить определенный элемент из моего массива из объекта

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

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

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

  1. Получить пакет для обработки
  2. Получите имя TypeUser, которое нужно удалить из массива TypeUser пакета.
  3. Выполните проверку: если пакет содержит только один тип пользователя, пакет удаляется напрямую. Если он содержит более одного, просто удалите выбранный 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 моего пакета. Затем это переводится в базу данных.

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

Ваш код удаляет сам пакет, если есть 1 тип.

Elanochecer 25.03.2019 15:45

Да, именно этого я и желаю, если останется только один тип. Оно работает. Но если их несколько, я хочу, чтобы он просто удалил typeUser, переданный в качестве параметра.

Agar io FR 25.03.2019 15:46

Затем измените это: $em->$unPaquet->deleteTypeFromTypesUser($leType); в $unPaquet->deleteTypeFromTypesUser($leType);

Elanochecer 25.03.2019 15:49

Да, это хорошо. Теперь у меня есть новая ошибка: Catchable Fatal Error: аргумент 1, переданный Site\PagesBundle\Entity\Paquet::deleteTypeFromTypesUser(), должен быть экземпляром Site\PagesBundle\Entity\TypeUser, данный массив, вызывается в /usr/ local/apache/preprod_8080/htdocs/alatech/src/Site/Pages‌​Bundle/Controller/Pa‌​quetController.php в строке 146 и определено. Я должен написать тип моей переменной в строке: $unPaquet->deleteTypeFromTypesUser($ ЛеТип);

Agar io FR 25.03.2019 15:53

Проверьте мой ответ.

Elanochecer 25.03.2019 15:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
1 534
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Пожалуйста. Примите мой ответ, если вы нашли его полезным, пожалуйста.

Elanochecer 25.03.2019 16:12

Другие вопросы по теме