Доктрина 2: каскадное удаление ManyToOne приводит к удалению ссылочной сущности

У меня есть настройка, где у меня есть фиды продуктов, и у каждого фида есть много продуктов. Очень упрощенная настройка выглядит примерно так:

Модель подачи:

/**
* Class Feed represents a single feed as supplier by a supplier
* @package App\Model
* @Entity @Table(name="feeds")
*/
class Feed
{
/**
* @var int
* @Id @Column(type="integer") @GeneratedValue
*/
protected $id;
}

Модель продукта:

/**
* Class Product is the base for either supplied and current products
* @package App\Model
*/
class Product
{
/**
* @var int
* @Id @Column(type="integer") @GeneratedValue
*/
protected $id;

/**
* @var Feed
* @ManyToOne(targetEntity="App\Model\Feed", cascade={"remove"})
* @JoinColumn(name="id_feed", referencedColumnName="id", onDelete="CASCADE")
*/
protected $feed;
}

Теперь, как вы видите, у меня включен каскад, потому что я хочу, чтобы все продукты автоматически удалялись при удалении канала.

Однако … В тот момент, когда я удаляю продукт, он также приводит к удалению исходного канала. Я подозреваю, что это как-то связано с настройкой отношения, но я не могу понять, где оно неправильно.

Кто-нибудь может показать больше света в этой ситуации?

1

Решение

Модель подачи:

    /**
* Class Feed represents a single feed as supplier by a supplier
* @package App\Model
* @Entity @Table(name="feeds")
*/
class Feed
{
/**
* @var int
* @Id @Column(type="integer") @GeneratedValue
*/
protected $id;

/**
* @var Feed
* @OneToMany(targetEntity="App\Model\Product", mappedBy="feed", orphanRemoval=true, cascade={"remove"})
*
*/
protected $products;

}

Модель продукта:

/**
* Class Product is the base for either supplied and current products
* @package App\Model
*/
class Product
{
/**
* @var int
* @Id @Column(type="integer") @GeneratedValue
*/
protected $id;

/**
* @var Feed
* @ManyToOne(targetEntity="App\Model\Feed", inversedBy="products")
* @JoinColumn(name="id_feed", referencedColumnName="id")
*/
protected $feed;
}

Теперь, если вы удалите объект Feed, объекты Product, связанные с этим Feed, также будут удалены.

Это двунаправленное отношение.

Больше информации :

Каскад = { «удалить»}

  • Объект на обратной стороне будет удален, а сторона-владелец (Feed) будет удалена, но только если объект (Product) не принадлежит другому, чем Feed.

orphanRemoval = «истина»

  • То же, что и выше, но ORM игнорирует, если объект (продукт) принадлежит другому объекту
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]