Доктрина 2 каскадного удаления не работает? Я проверил все связанные anwsers на stackoverflow, но они не работали

0

Я пытаюсь использовать каскадное удаление в doctrine2, следующие мои классы объектов, но каскадное удаление вообще не работает.

Когда я выполняю удаление, запись удаляется из таблицы пользователя, но не из таблицы опыта. Я не получаю никаких ошибок, но удаление каскада не работает.

Родительский класс

/**
 * @ORM\Entity
 */
class ilook_user
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", length=11)
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\OneToMany(targetEntity="Entities\experience", mappedBy="experiencesUser",  cascade={"remove"})
     */
    private $usersExperience;

Класс ребенка

/**
 * @ORM\Entity
 */
class experience
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", length=11)
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
   /**
    * @ORM\ManyToOne(targetEntity="Entities\ilook_user", inversedBy="usersExperience")
    * @ORM\JoinColumn(name="ilook_user_id", referencedColumnName="id", nullable=false)
    */
    private $experiencesUser;

Метод, который я использую для удаления записи:

public static function softDeleteUser($user_id)
    {
        //Delete user
        $em = \Zend_Registry::get('em');
        $usr_obj = $em->find('\Entities\ilook_user', $user_id);
        $em->remove($usr_obj);
        $em->getConnection()->close();
        $em->flush();
        return TRUE;
    }
  • 0
    Вероятно, это помогло бы, если бы у нас было больше информации о проблемном поведении: «Не работает вообще» может означать довольно много разных вещей. Вы получаете код ошибки? Неверный вывод / поведение? Какие шаги по отладке вы предприняли и каковы ваши выводы?
  • 0
    Я имею в виду, что запись удаляется из таблицы пользователей, но не из таблицы опыта. Я не получаю никакой ошибки, но каскадное удаление не работает.
Показать ещё 2 комментария
Теги:
doctrine2

2 ответа

0

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

Бренды (1) → (N) Автомобили

Поэтому, если вы удалите бренд, все соответствующие Автомобили будут удалены автоматически.

БРЕНДЫ

/**
 * @ORM\Entity
 * @ORM\Table(name="brands")
 */
class Brands
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="Cars", mappedBy="brands")
     */
    private $cars;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->cars = new ArrayCollection();
    }
}

ЛЕГКОВЫЕ АВТОМОБИЛИ

/**
 * @ORM\Entity
 * @ORM\Table(name="cars")
 */
class Cars
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Brands", inversedBy="cars")
     * @ORM\JoinColumn(name="brands_id", referencedColumnName="id", onDelete="CASCADE", nullable=false)
     */
    protected $brands;
}

РЕДАКТИРОВАТЬ:

Если вы не хотите добавлять в базу данных ON DELETE CASCADE, попробуйте это вместо этого:

/**
 * @ORM\OneToMany(targetEntity="Entities\experience", mappedBy="experiencesUser",  cascade={"remove"}, orphanRemoval=true)
 */
private $usersExperience;
  • 0
    Хороший ответ inanzzz, но я сохранил это как второй вариант, потому что onDelete = "CASCADE" работает на уровне базы данных, нужно снова создавать таблицы БД из классов сущностей. Принимая во внимание, что cascade = {"remove"} будет применяться в родительской сущности и работает на уровне сущности.
  • 0
    Вы также пытались добавить orphanRemoval=true ? Так что это будет ........ mappedBy=............., cascade={"remove"}, orphanRemoval=true Читайте об этом здесь
Показать ещё 2 комментария
0

Я делаю это потому, что вы используете каскадирование на обратной стороне отношения, а не на стороне владельца.

Я думаю, что отношения в порядке. Вы закрываете соединение перед промывкой.

  • 0
    Вы указали на кое-что очень важное, что мы должны закрыть соединение после сброса, но с этим даже моя проблема не решилась.
  • 0
    попробуй очистить кеш. Иногда аннотации являются кешами, а доктрина не видит никаких изменений.

Ещё вопросы

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