यहाँ सरल उदाहरण है। एक संपर्क में कई संबंधित फोन नंबर होते हैं। जब कोई संपर्क हटा दिया जाता है, तो मैं चाहता हूं कि उसके सभी संबद्ध फोन नंबर भी हटा दिए जाएं, इसलिए मैं DELETE CASCADE का उपयोग करता हूं। फोन-ऑनरल्स में विदेशी कुंजी द्वारा एक-से-कई / कई-से-एक रिश्ते को लागू किया जाता है।
CREATE TABLE contacts
(contact_id BIGINT AUTO_INCREMENT NOT NULL,
name VARCHAR(75) NOT NULL,
PRIMARY KEY(contact_id)) ENGINE = InnoDB;
CREATE TABLE phone_numbers
(phone_id BIGINT AUTO_INCREMENT NOT NULL,
phone_number CHAR(10) NOT NULL,
contact_id BIGINT NOT NULL,
PRIMARY KEY(phone_id),
UNIQUE(phone_number)) ENGINE = InnoDB;
ALTER TABLE phone_numbers ADD FOREIGN KEY (contact_id) REFERENCES \
contacts(contact_id) ) ON DELETE CASCADE;
विदेशी प्रमुख बाधा पर "ON DELETE CASCADE" जोड़कर, फोन_नोट्स स्वचालित रूप से हटा दिए जाएंगे जब उनका संबद्ध संपर्क हटा दिया जाएगा।
INSERT INTO table contacts(name) VALUES('Robert Smith');
INSERT INTO table phone_numbers(phone_number, contact_id) VALUES('8963333333', 1);
INSERT INTO table phone_numbers(phone_number, contact_id) VALUES('8964444444', 1);
अब जब संपर्क तालिका में एक पंक्ति हटा दी जाती है, तो उसके सभी संबद्ध फ़ोन_नोट पंक्तियाँ स्वचालित रूप से हटा दी जाएंगी।
DELETE TABLE contacts as c WHERE c.id=1; /* delete cascades to phone_numbers */
डॉक्ट्रिन में समान चीज़ को प्राप्त करने के लिए, उसी DB स्तर के "ON DELETE CASCADE" व्यवहारकर्ता को प्राप्त करने के लिए, आप @JoinColumn onDelete = "CASCADE" विकल्प से कॉन्फ़िगर करें ।
<?php
namespace Entities;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity
* @Table(name="contacts")
*/
class Contact
{
/**
* @Id
* @Column(type="integer", name="contact_id")
* @GeneratedValue
*/
protected $id;
/**
* @Column(type="string", length="75", unique="true")
*/
protected $name;
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact")
*/
protected $phonenumbers;
public function __construct($name=null)
{
$this->phonenumbers = new ArrayCollection();
if (!is_null($name)) {
$this->name = $name;
}
}
public function getId()
{
return $this->id;
}
public function setName($name)
{
$this->name = $name;
}
public function addPhonenumber(Phonenumber $p)
{
if (!$this->phonenumbers->contains($p)) {
$this->phonenumbers[] = $p;
$p->setContact($this);
}
}
public function removePhonenumber(Phonenumber $p)
{
$this->phonenumbers->remove($p);
}
}
<?php
namespace Entities;
/**
* @Entity
* @Table(name="phonenumbers")
*/
class Phonenumber
{
/**
* @Id
* @Column(type="integer", name="phone_id")
* @GeneratedValue
*/
protected $id;
/**
* @Column(type="string", length="10", unique="true")
*/
protected $number;
/**
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/
protected $contact;
public function __construct($number=null)
{
if (!is_null($number)) {
$this->number = $number;
}
}
public function setPhonenumber($number)
{
$this->number = $number;
}
public function setContact(Contact $c)
{
$this->contact = $c;
}
}
?>
<?php
$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
$contact = new Contact("John Doe");
$phone1 = new Phonenumber("8173333333");
$phone2 = new Phonenumber("8174444444");
$em->persist($phone1);
$em->persist($phone2);
$contact->addPhonenumber($phone1);
$contact->addPhonenumber($phone2);
$em->persist($contact);
try {
$em->flush();
} catch(Exception $e) {
$m = $e->getMessage();
echo $m . "<br />\n";
}
अगर आप अब
# doctrine orm:schema-tool:create --dump-sql
आप देखेंगे कि वही SQL पहले, कच्चे-SQL उदाहरण के रूप में जेनरेट होगा