Bonjour à tous,

Après plusieurs recherche, je n'arrive pas à trouver une solution à mon probème.
J'ai une table Sandwich_Shop avec un champs idAddress avec comme contrainte qu'il doit correspondre au champs id de ma table Address.
Voici mon code:

class SandwichShop extends AppModel{
    public $name = 'SandwichShop';
        public $useTable = 'sandwich_shops';
        //public $hasOne = 'Address';
        var $hasOne = array(       
          'Address' => array(   
              'className' => 'Address',   
              'foreignKey' => 'idAddress'      
           ) 
           );

class Address extends AppModel{
    public $name = 'Address';
    public $useTable = 'Address';
    var $hasOne = array(      
          'SandwichShop' => array(  
                'className' => 'SandwichShop',    
                'foreignKey' => 'idAddress'      
                )
         );  
}

Et voici l'erreur:

Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`a6950034_sand`.`sandwich_shops`, CONSTRAINT `sandwich_shops_ibfk_1` FOREIGN KEY (`idAddress`) REFERENCES `address` (`id`) ON DELETE CASCADE)

Lorsque je demande d’exécuter la ligne:

$this->SandwichShop->save($d,true,array('password','username','street','cp','city','country'));

6 réponses


snap
Réponse acceptée

Je suis pas sur mais je pense que le $hasOne du model SandwichShop devrait être remplacé par un belongsTo.

class SandwichShop extends AppModel{
    public $name = 'SandwichShop';
        public $useTable = 'sandwich_shops';
        var $belongsTo = array(       
          'Address' => array(   
              'className' => 'Address',   
              'foreignKey' => 'idAddress'     
           ) 
           );
guispeed426
Auteur
Réponse acceptée

Voilà j'ai enfin réussi, merci snap pour ton aide, voici la solution:

class SandwichShop extends AppModel{
    public $name = 'SandwichShop';
        public $useTable = 'sandwich_shops';
        public $belongsTo= array(       
          'Address' => array(   
              'className' => 'Address',   
              'foreignKey' => 'idAddress'    
                ) 
           );

class Address extends AppModel{
    public $name = 'Address';
    public $useTable = 'Address';
    public $hasOne = 'SandwichShop';
}

Bonjour,

Vérifie la requête que Cake te génère. A priori il lui manque la clé étrangère et c'est pour ça que mysql te génère une erreur de contraintes d'intégrité. Si tu arrives à visualiser la requête, tu comprendras certainement d'où vient ton erreur...

Happy Baking !

Jpense que tu devrais modifier les liaisons faites au sein de mysql.

Cakephp ne prend pas en compte les foreign key qui sont dans MySql ?

Fait attention tu devrait laisser le model Adress comme avant avec 'foreignKey' => 'idAddress' car ta requête marche sans mais si tu fait une requête dans ton controller Adress (ou autre part d'ailleurs)

$this->Adress->find('all');

ça ne marchera pas sans le 'foreignKey' => 'idAddress' dans le model Adress