簡體   English   中英

Symfony2級聯刪除

[英]Symfony2 Cascade on Delete

我有兩個實體:

  1. 貨倉

      id | name --------------------- 1 | Warehouse 1 2 | Warehouse 2 
  2. 項目

      id | warehouse_id | name -------------------------------------- 1 | 1 | Item 1 2 | 2 | Item 2 

我想知道如果從倉庫表中刪除“倉庫1”,如何將Warehouse_id的值設置為Null。 實際上,如果刪除了“倉庫1”,實際上我需要在數據庫中的所有表上將Warehouse_id設置為NULL。

例如,在我的“項目”實體中,我已進行了此設置,而刪除“倉庫1”后,它似乎對我沒有任何幫助

 /**
 * @ORM\ManyToOne(targetEntity="WIC\WarehouseBundle\Entity\Warehouse", inversedBy="purchaseOrderLineItemLocation")
 * @ORM\JoinColumn(name="warehouse_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
 * @Common\Versioned
 */
protected $warehouse;

這是我完整的倉庫實體

這里是否需要設置一些內容?

 /**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 * @ORM\Column(name="name", type="string", length=255)
 * @Common\Versioned
 * @Assert\NotBlank(message="Location Name cannot be blank.")
 */
private $name;

/**
 * @var string $description
 *
 * @Common\Versioned
 * @ORM\Column(name="description", type="text")
 */
protected $description;

/**
 * @var string
 * @ORM\Column(name="address", type="string", length=255)
 * @Common\Versioned
 * @Assert\NotBlank(message="Address cannot be blank.")
 */
private $address;

/**
 * @var string
 * @ORM\Column(name="address2", type="string", length=255, nullable=true)
 * @Common\Versioned
 */
private $address2;

/**
 * @var string
 * @ORM\Column(name="city", type="string", length=255)
 * @Common\Versioned
 * @Assert\NotBlank(message="City cannot be blank.")
 */
private $city;

/**
 * @var string
 * @ORM\Column(name="state", type="string", length=255)
 * @Common\Versioned
 * @Assert\NotBlank(message="State cannot be blank.")
 */
private $state;

/**
 * @var string
 * @ORM\Column(name="zip", type="string", length=255)
 * @Gedmo\Versioned
 * @Assert\NotBlank(message="Zip cannot be blank.")
 */
private $zip;

/**
 * @var string
 * @ORM\Column(name="country", type="string", length=255, nullable=true)
 * @Common\Versioned
 */
private $country;

/**
 * @var string
 * @ORM\Column(name="phone", type="string", length=255, nullable=true)
 * @Common\Versioned
 */
private $phone;

/**
 * @var string
 * @ORM\Column(name="email", type="string", length=255, nullable=true)
 * @Common\Versioned
 */
private $email;

/**
 * @var string
 * @ORM\Column(name="fax", type="string", length=255, nullable=true)
 * @Common\Versioned
 */
private $fax;

/**
 * @ORM\OneToMany(targetEntity="WIC\InventoryLocationBundle\Entity\InventoryLocation", mappedBy="inventoryLocation")
 */
protected $inventoryLocations;

/**
 * @ORM\ManyToOne(targetEntity="WIC\UserBundle\Entity\User")
 * @ORM\JoinColumn(name="created_by", referencedColumnName="id")
 * @Common\Blameable(on="create")
 */
private $createdBy;

/**
 * @ORM\ManyToOne(targetEntity="WIC\UserBundle\Entity\User")
 * @ORM\JoinColumn(name="updated_by", referencedColumnName="id")
 * @Common\Blameable(on="update")
 */
private $updatedBy;

/**
 * @ORM\ManyToOne(targetEntity="WIC\AccountBundle\Entity\Account", inversedBy="warehouses")
 * @ORM\JoinColumn(name="account_id", referencedColumnName="id", nullable=false)
 * @Common\Versioned
 * @Common\Blameable(on="create")
*/
protected $account;

/**
 * @var datetime $created
 *
 * @Common\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
private $created;

/**
 * @var datetime $updated
 *
 * @Common\Timestampable(on="update")
 * @ORM\Column(type="datetime", nullable=true)
 */
private $updated;

/**
 * @ORM\Column(name="deletedAt", type="datetime", nullable=true)
 */
private $deletedAt;


public function __construct()
{
    $this->inventoryLocations = new ArrayCollection();
}

您最好將其保留為刪除限制,然后使用原則事件訂閱者將引用設置為null。

http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html

這將使您對過程有更多的控制,並使您知道應用程序在做什么。 在破壞數據時,請盡量不要讓框架自己采取行動,否則,您將開始在應用程序中創建難以診斷的漏洞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM