2010-01-16 17 views
4

Je rencontre des problèmes pour obtenir l'ID après l'insertion d'un nouvel enregistrement à l'aide de PHP Doctrine Project.Obtention d'un ID après l'insertion d'un enregistrement ayant une relation dans Doctrine

Lors de l'insertion d'un nouvel enregistrement dans une table sans table parent (aucune clé étrangère), aucun problème ne se produit. Mais lors de l'insertion d'un enregistrement lié vient le problème, que je reçois seulement l'identifiant parent qui est inutile dans mon cas.

PHP exemple de code:

$city = new City(); 
$city->name = "Baghdad"; 
$city->country_id = 6; 
$city->save(); 
print_r($city->identifier()); 
exit; 

La sortie est la suivante:

Array 
(
    [id] => 
    [country_id] => 6 
) 

Pourquoi l'ID est vide !, où la ligne a été insérée avec succès !. J'ai besoin de ceci pour faire plus d'insertion qui a basé le city.id, comme d'autres régions qui ont cette ville en tant que parent.

Remarque à l'aide des $city->id provoque cette erreur: Warning: Invalid argument supplied for foreach() in Doctrine/Record.php on line 1151

base de données SQL Dump:

CREATE TABLE IF NOT EXISTS `country` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(64) collate utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name_UNIQUE` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ; 


CREATE TABLE IF NOT EXISTS `city` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(64) collate utf8_unicode_ci NOT NULL, 
    `country_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`,`country_id`), 
    KEY `fk_city_country` (`country_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ; 


ALTER TABLE `city` 
    ADD CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION; 

BTW: J'utilise la méthode Doctrine::generateModelsFromDb() pour générer des classes de modèle ORM. PS: en utilisant la version 1.2.1 de Doctrine, mysql: innodb 5.0.75-0ubuntu10.2, et php 5.2.6-3ubuntu4.5.

+1

Vous avez deux tables de pays dans votre vidage db, table de la ville est manquant – Karsten

+0

Mon mauvais, je l'ai édité. –

Répondre

5

Un collègue a découvert la solution. Il était à cause de cette ligne de code:

PRIMARY KEY (`id`,`country_id`), 

je ceci:

PRIMARY KEY (`id`), 

Et cela fonctionne correctement.

C'est un problème MySQL je suppose . Ce n'est pas, c'est bug dans la conception de mes tables.

+0

Je pensais à cela aussi, pourquoi avez-vous ajouté le country_id à la clé primaire en premier lieu? Ou est-ce que Doctrine a fait ça? – Karsten

+0

Vraiment, je ne suis pas très bon dans MYSQL ou base de données en général, je suis mieux dans le codage. C'est mon erreur dans la conception de la base de données en premier lieu. BTW: J'ai utilisé Mysql-workbench pour le concevoir. –

0

Est-ce que print_r($city->get('id')); contient plus d'informations?

+0

Non, il contient null, et provoque cette erreur: 'Avertissement: argument non valide fourni pour foreach() dans Doctrine/Record.php sur la ligne 1151 NULL' –