Я пытаюсь использовать каскадное удаление в 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;
}
Используйте пример ниже в качестве ссылки. Меня устраивает. Я избавился от каких-то аннотаций, свойств, методов, чтобы не допустить его.
Бренды (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;
orphanRemoval=true
? Так что это будет ........ mappedBy=............., cascade={"remove"}, orphanRemoval=true
Читайте об этом здесь
Я делаю это потому, что вы используете каскадирование на обратной стороне отношения, а не на стороне владельца.
Я думаю, что отношения в порядке. Вы закрываете соединение перед промывкой.