Hi Manfred JB,
you need to create this foreign key from Singer to Person:
ALTER TABLE singers
ADD CONSTRAINT fk_dady
FOREIGN KEY (id_person)
REFERENCES persons (id_person)
ON DELETE CASCADE
ON UPDATE NO ACTION;
My be this help
you:
http://stackoverflow.com/questions/13444859/sql-on-delete-cascade-which-way-does-the-deletion-occur
Is it working finally?
El dissabte 31 de maig de 2014 22:41:17 UTC+2, Manfred JB va escriure:
>
> I have made a really basic example with two models.
>
> "Singer" extends from "Person"
>>
>
> I am using class table Inheritance with these two models:
>
> <?php
> namespace models;
>
> /**
> * @Table(name="persons")
> * @entity
> * @InheritanceType("JOINED")
> * @DiscriminatorColumn(name="type", type="string")
> * @DiscriminatorMap({"singer" = "\models\Singer"})
> */
> abstract class Person {
>
> /**
> * @Id
> * @Column(type="integer", nullable=false, name="id_person")
> * @GeneratedValue(strategy="AUTO")
> */
> protected $id;
>
> /** @column(type="string", nullable=false) */
> protected $name;
>
> The singer model looks like:
>
> namespace models;
>
> /**
> * @Table(name="singers")
> * @entity
> */
> class Singer extends Person{
>
> /** @column(type="string", nullable=false) */
> protected $gender;
> }
>
>
> *Worflow*
>
> Considere this scenario.
>
> 1. In the db I have these rows:
>
> persons table:
>
> id_person | name | type
> -----------------------
> 1 john singer
>
> singers table:
>
>
> id_person | gender
> ------------------
> 1 pop
>
> 2. I proceed to remove this singer:
>
> $singer = $em->find('models\Singer', 1);
> $em->remove($singer);
> $em->flush();
>
> 3. After execute the code above, I check again the database and I found
> this:
>
> persons table:
>
> id_person | name | type
> -----------------------
> (empty)
>
> singers table:
>
>
> id_person | gender
> ------------------
> 1 pop
>
> As you note, the row from child table was not removed as expected.
>
>
> 4. So, after searching in doctrine's documentation, it states:
>
> >When you do not use the SchemaTool to generate the required SQL you
> should know that deleting a class table inheritance makes use of the
> foreign key property ON DELETE CASCADE in all database implementations. A
> failure to implement this yourself will lead to dead rows in the database.
>
> So, I proceed to alter persons table as below:
>
> ALTER TABLE persons
> ADD CONSTRAINT fk_persons_1
> FOREIGN KEY (id_person)
> REFERENCES singers (id_person)
> ON DELETE CASCADE
> ON UPDATE NO ACTION;
>
>
> Now, the problems get complicated:
>
> * when I remove a singer, the information still there, even the persons
> table was altered in order to delete from singers table too.
> * When I try to insert a new singer like
>
> $singer = new \models\Singer('Zara', 'rock');
> $em->persist($singer);
> $em->flush();
>
> it throws an exception:
>
> Fatal error: Uncaught exception 'PDOException' with message
> 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update
> a child row: a foreign key constraint fails (`practica`.`persons`,
> CONSTRAINT `fk_persons_1` FOREIGN KEY (`id_person`) REFERENCES `singers`
> (`id_person`) ON DELETE CASCADE ON UPDATE NO ACTION)' in
> /var/www/html/doctrine/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php:138
>
> Stack trace: #0
> /var/www/html/doctrine/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php(138):
>
> PDOStatement->execute(NULL) #1
> /var/www/html/doctrine/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/JoinedSubclassPersister.php(165):
>
> Doctrine\DBAL\Statement->execute() #2
> /var/www/html/doctrine/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(929):
>
> Doctrine\ORM\Persisters\JoinedSubclassPersister->executeInserts() #3
> /var/www/html/doctrine/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(318):
>
> Doctrine\ORM\UnitOfWork->executeInserts(Object(Doctrine\ORM\Mapping\ClassMetadata))
>
> #4 /var/www/html/doctrine/vendor/doct in
> /var/www/html/doctrine/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php
>
> on line 47
>
>
> So, basically, all I need is to remove the information in child table too.
> But I do not get it.
>
>
>
>
--
You received this message because you are subscribed to the Google Groups
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.