2016-10-05 2 views
0

У меня есть объект-адрес, который используется в других других объектах, есть пользователи с адресом, есть магазины и компании.Symfony2: каскад ondelete для обратных отношений

Теперь то, что я пытаюсь сделать, это убедиться, что адрес автоматически удаляется, когда магазин будет удален, так что я попытался это:

/** 
* Shop 
* 
* @ORM\Table(name="shop") 
* @ORM\Entity 
*/ 
class Shop { 
    /** 
    * @ORM\OneToOne(targetEntity="Address",cascade={"persist", "remove"}) 
    * @ORM\JoinColumn(name="address", referencedColumnName="id",nullable=true, onDelete="CASCADE") 
    */ 
    private $address; 

    ... 
} 

/** 
* Address 
* 
* @ORM\Table(name="address") 
* @ORM\Entity 
*/ 
class Address { 
    //... 
} 

Но это не то, что я хочу, после удаления магазина в адрес все еще существует. Как я могу справиться с этим, есть ли способ сделать это?

Спасибо!

ответ

1

Вам просто нужно добавить каскад remove опцию

/** 
* Shop 
* 
* @ORM\Table(name="shop") 
* @ORM\Entity 
*/ 
class Shop { 
    /** 
    * @ORM\ManyToOne(targetEntity="Address", cascade={"persist, remove"}) 
    * @ORM\JoinColumn(name="address", referencedColumnName="id") 
    */ 
    private $address; 

    ... 
} 

onDelete="CASCADE" означает, что, когда внедренный объект удаляется, родительский объект должен быть удален тоже. Он обрабатывается на уровне базы данных.

cascade={"remove"} означает, что при отмене родительского объекта встроенный объект должен быть удален. Он обрабатывается на уровне orm.

Обратите внимание, что вам не нужно указывать nullable=true в аннотации JoinColumn, значение по умолчанию - значение по умолчанию.

Update после комментариев

Если субъекты имеют только один адрес, то вы должны использовать соотношение OneToOne. Если вы хотите вернуть ссылку в «Магазин в адресе», тогда вам нужен двунаправленный, иначе у вас будет однонаправленный.

Однонаправленный:

/** 
* Shop 
* 
* @ORM\Table(name="shop") 
* @ORM\Entity 
*/ 
class Shop { 
    /** 
    * @ORM\OneToOne(targetEntity="Address", cascade={"persist, remove"}) 
    * @ORM\JoinColumn(name="address_id", referencedColumnName="id") 
    */ 
    private $address; 

    // ... 
} 

/** 
* Address 
* 
* @ORM\Table(name="address") 
* @ORM\Entity 
*/ 
class Address { 
    // ... 
} 

Двунаправленный:

/** 
* Shop 
* 
* @ORM\Table(name="shop") 
* @ORM\Entity 
*/ 
class Shop { 
    /** 
    * @ORM\OneToOne(targetEntity="Address", mappedBy="shop", cascade={"persist, remove"}) 
    */ 
    private $address; 

    // ... 
} 

/** 
* Address 
* 
* @ORM\Table(name="address") 
* @ORM\Entity 
*/ 
class Address { 
    /** 
    * @ORM\OneToOne(targetEntity="Shop", inversedBy="address") 
    * @ORM\JoinColumn(name="shop_id", referencedColumnName="id") 
    */ 
    private $shop; 

    // Same for user/company 
    // ... 
} 
+0

, когда я попытался его с каскадом = { "сохраняются", "удалить"} не работает - когда я удалить магазин адрес все еще существует – Chi

+0

@Chi. Вам нужно указать принадлежность к ассоциации, добавьте опцию 'mappedBy =" shop "' в аннотацию ManyToOne (убедитесь, что имя атрибута является магазином в вашей сущности Address или дает правильный) , – lolmx

+0

, но это не имеет смысла в этом случае, потому что адрес не всегда имеет клуб, дающий ему несколько столбцов для магазина, пользователя, компании и т. Д., Кажется мне странным – Chi

Смежные вопросы