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.

Reply via email to