Как удалить сущность из symfony2

42

Мой первый проект symfony2 - это список гостей (приглашенных в мероприятии), хранящихся в базе данных. У меня

  • создал сущность класса Guest со всеми переменными для них (идентификатор, имя, адрес, номер телефона и т.д.).
  • создал схему в mysql db
  • создал маршрут для добавления "гостя" к шаблону ветки.
  • создал formType

и, наконец, метод createGuest в контроллере, и все работает нормально.

Мне не удастся удалить гостя из базы данных. Я прочитал каждый учебник в Интернете, включая официальную книгу Symfony2; все, что он говорит:

Удаление объекта

Удаление объекта очень похоже, но требует вызова метода remove() диспетчера сущностей:

$em->remove($product);
$em->flush();

В нем ничего не сказано (даже в разделе "Обновить объект" отсутствует документация) о том, как подключить контроллер deleteAction ($ id) с шаблоном ветки. То, что я хочу сделать, - это перечислить всех гостей с помощью действия viewGuests и шаблона twig viewGuests, имеющего значок удаления рядом с каждой строкой, который вы должны щелкнуть, чтобы удалить запись. Простой, но я не могу найти документацию и не знаю, с чего начать.

public function deleteGuestAction($id)
    {
        $em = $this->getDoctrine()->getEntityManager();
        $guest = $em->getRepository('GuestBundle:Guest')->find($id);

        if (!$guest) {
            throw $this->createNotFoundException('No guest found for id '.$id);
        }

        $em->remove($guest);
        $em->flush();

        return $this->redirect($this->generateUrl('GuestBundle:Page:viewGuests.html.twig'));
    }
  • 0
    У вас есть ошибка?
  • 0
    На самом деле нет ошибки. Я не знаю, как интерфейс шаблона ветки. Это означает: у вас есть таблица, в которой в каждом ряду отображается гость и некоторая информация (имя, фамилия, номер телефона и т. Д.) Вместе со значком <img>. Я хочу нажать на эту кнопку и удалить строку из базы данных.
Показать ещё 4 комментария
Теги:
doctrine

3 ответа

63
Лучший ответ

Symfony умный и знает, как сделать find() самостоятельно:

public function deleteGuestAction(Guest $guest)
{
    if (!$guest) {
        throw $this->createNotFoundException('No guest found');
    }

    $em = $this->getDoctrine()->getEntityManager();
    $em->remove($guest);
    $em->flush();

    return $this->redirect($this->generateUrl('GuestBundle:Page:viewGuests.html.twig'));
}

Чтобы отправить идентификатор в свой контроллер, используйте {{ path('your_route', {'id': guest.id}) }}

  • 0
    Я думаю, что сделал шаг вперед. Нажав на значок удаления каждой записи, я получаю ссылку типа "/ deleteguest? Id = 4", которая выглядит так, будто шаблон отправляет идентификатор текущей гостевой строки. К сожалению, я получаю это сообщение: «Невозможно угадать, как получить экземпляр Doctrine из информации запроса».
  • 0
    Ваше решение работает. тег / {id} отсутствовал в файле routing.yml. Я предполагал, что deleteguest? Id = 4 сделает работу, но это не так. Наконец, deleteguest / 4 кажется нормальным. Большое спасибо.
Показать ещё 3 комментария
4

УДАЛИТЬ ОТ... WHERE id =...;

protected function templateRemove($id){
            $em = $this->getDoctrine()->getManager();
            $entity = $em->getRepository('XXXBundle:Templates')->findOneBy(array('id' => $id));

            if ($entity != null){
                $em->remove($entity);
                $em->flush();
            }
        }
2

Из того, что я понимаю, вы боретесь с тем, что добавить в свой шаблон.

Я приведу пример:

<ul>
    {% for guest in guests %}
    <li>{{ guest.name }} <a href="{{ path('your_delete_route_name',{'id': guest.id}) }}">[[DELETE]]</a></li>
    {% endfor %}
</ul>

Теперь, что происходит, он выполняет итерацию по каждому объекту внутри гостей (вам придется переименовать его, если ваша коллекция объектов называется иначе!), показывает имя и помещает правильную ссылку. Название маршрута может отличаться.

  • 0
    Это работает для ссылки в списке гостей, но она перенаправляет в файл deleteGuest.html.twig ... в котором я не знаю, что вставить!
  • 0
    Итак, ваша проблема - это редирект? Я не знаю о вашем использовании, но я делаю что-то вроде return $this->redirect($this->generateUrl('route_name_where_i_want_to_go')); перенаправить пользователя на страницу.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню