Hello Jordi, You are correct, this is the best way to do that. I had found the aswers days ago but thank you much for your reply :)
El jueves, 17 de julio de 2014 04:29:49 UTC-6, Jordi Martínez escribió: > > 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.
