Php Symfony2在删除时级联

Php Symfony2在删除时级联,php,symfony,orm,doctrine-orm,Php,Symfony,Orm,Doctrine Orm,我有两个实体: 仓库 id | name --------------------- 1 | Warehouse 1 2 | Warehouse 2 项目 id | warehouse_id | name -------------------------------------- 1 | 1 | Item 1 2 | 2 | Item 2 我想知道如果我从仓库表中删

我有两个实体:

  • 仓库

      id | name           
      ---------------------
      1  | Warehouse 1
      2  | Warehouse 2
    
  • 项目

      id | warehouse_id   | name
      --------------------------------------
      1  | 1              |  Item 1
      2  | 2              |  Item 2
    
  • 我想知道如果我从仓库表中删除“warehouse 1”,如何将warehouse_id的值设置为Null。实际上,如果我删除“warehouse 1”,我需要在数据库中的所有表上将warehouse_id设置为NULL

    例如,在我的“Items”实体中,我设置了这个选项,当我删除“warehouse1”时,它似乎对我没有任何作用

    这是我的完整仓库实体

    这里有什么我需要设置的吗

     /**
     * @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();
    }
    

    您最好将其保留为限制删除,然后使用doctrine事件订阅服务器将引用设置为null


    这将使您能够更好地控制流程,并让您了解应用程序正在做什么。当涉及到数据破坏时,尽量不要让框架自行行动,否则您将在应用程序中开始创建难以诊断的漏洞。

    可能重复我已经尝试过,onDelete=“SET NULL”但我似乎无法使其工作。是的,但您更新了模式吗?是的,然后我尝试删除一个仓库,但该项目的仓库id没有设置为null。
     /**
     * @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();
    }