在Doctrine中插入有关系的记录后获取ID

Posted

技术标签:

【中文标题】在Doctrine中插入有关系的记录后获取ID【英文标题】:Getting ID after inserting a record that has relation in Doctrine 【发布时间】:2010-01-16 10:53:08 【问题描述】:

我在使用 php Doctrine Project 插入新记录后无法获取 id。

在没有父表(没有外键)的表中插入新记录时不会出现问题。 但是当在这里插入相关记录时,问题就来了,我只得到了在我的情况下没用的父 id。

PHP 代码示例:

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

输出是:

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

为什么ID为空!,成功插入行的地方!。 我需要这个来做更多基于 city.id 的插入,就像以这个城市为父级的其他区域一样。

注意使用$city->id 会导致此错误: Warning: Invalid argument supplied for foreach() in Doctrine/Record.php on line 1151

数据库 SQL 转储:

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;

顺便说一句:我正在使用Doctrine::generateModelsFromDb() 方法来生成ORM 模型类。

PS:使用 Doctrine 版本 1.2.1,mysql:innodb 5.0.75-0ubuntu10.2 和 php 5.2.6-3ubuntu4.5。

【问题讨论】:

您的数据库转储中有两个国家/地区表,城市表丢失 【参考方案1】:

一位同事发现了解决方案。 就是因为这行代码:

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

我用过这个:

PRIMARY KEY  (`id`),

而且它工作正常。

我猜这是 MySQL 的问题。不是,这是我的表格设计中的错误。

【讨论】:

我也是这么想的,你当初为什么要在主键上加country_id?还是 Doctrine 这样做的? 真的,我在 MYSQL 或数据库方面总体上不是那么好,我在编码方面做得更好。最初设计数据库是我的错误。 BTW:我是用 Mysql-workbench 来设计的。【参考方案2】:

print_r($city->get('id')); 是否掌握更多信息?

【讨论】:

否,它为空,并导致此错误:Warning: Invalid argument supplied for foreach() in Doctrine/Record.php on line 1151 NULL

以上是关于在Doctrine中插入有关系的记录后获取ID的主要内容,如果未能解决你的问题,请参考以下文章

快速向有关系的表中插入 200 多个数据 - Laravel 5.6

Doctrine 2 - 多对一关系的外键不允许空值

获取与 NSFetchedResultsController 有关系的对象

Doctrine 2 - 如何在 PostPersist 中获取最后插入的 id 的 ID?

CoreData 获取请求 - 获取所有有关系的对象

Doctrine2 - 一次多次插入