Symfony2 教义关联映射错误处理

Posted

技术标签:

【中文标题】Symfony2 教义关联映射错误处理【英文标题】:Symfony2 doctrine association mapping error handling 【发布时间】:2015-01-09 06:43:02 【问题描述】:

使用 php app/console 学说时出现以下错误:schema:update --force。

[教义\DBAL\DBALException]
  执行“ALTER TABLE 配置文件添加约束”时发生异常
  FK_8B30853036802B0F 外键 (participantid) REFERENCES 参与者 (id
  )':
  SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新
  子行:外键约束失败(`smartplan_dev`.`#sql-518_60`,
   约束`FK_8B30853036802B0F`外键(`participantid`)参考
  `参与者`(`id`))

[PDO异常]
  SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新
  子行:外键约束失败 (smartplan_dev.#sql-518_60,
   约束 FK_8B30853036802B0F 外键 (participantid) 参考participants (id))

如果存在一个映射失败的实例,是否会发生此错误?我可以看到这是有问题的,因为我的客户喜欢直接使用 mysql 工作台进行编辑。有没有办法跳过失败的行而不是整个更新失败。

这是我有问题的实体文件。 (配置文件已部分完成)。

命名空间类\classBundle\Entity; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * 个人资料 * * @ORM\Table() * @ORM\实体 */ 班级简介 /** * * @ORM\ManyToOne(targetEntity="participants", inversedBy="profiles") * @ORM\JoinColumn(name="participantid", referencedColumnName="id") */ public $participant;//参与者变量 /** * @ORM\OneToMany(targetEntity="profilesBeneficiaries", mappedBy="profile") * */ public $beneficiaries;//受益人数组变量 公共$捐款; //贡献变量 公共$投资; //投资数组变量 公共 $retirementNeeds; //退休需求变量 public $riskProfile;//riskProfile 变量 /** * @var 整数 * * @ORM\Column(name="id", type="integer") * @ORM\ID * @ORM\GeneratedValue(strategy="AUTO") */ 公共$id; /** * @var 整数 * * @ORM\Column(name="participantid", type="integer") */ 公共 $participantid; /** * @var 整数 * * @ORM\Column(name="userid", type="integer") */ 公共$用户ID; /** * @var 字符串 * * @ORM\Column(name="planid", type="integer") */ 公共 $planid; /** * @var 字符串 * * @ORM\Column(name="planName", type="string", length=255) */ 公共$计划名称; /** * @var 字符串 * * @ORM\Column(name="currentBalance", type="float",length = 255) */ 公共 $currentBalance; /** * @var 字符串 * * @ORM\Column(name="beneficiaryStatus", type="text",length = 65535) */ 公共 $beneficiaryStatus; /** * @var 字符串 * * @ORM\Column(name="investmentsStatus", type="text",length = 65535) */ 公共$投资状态; /** * @var 字符串 * * @ORM\Column(name="realignmentStatus", type="text",length = 65535) */ 公共 $realignmentStatus; /** * @var 字符串 * * @ORM\Column(name="contributionsStatus", type="text",length = 65535) */ 公共 $contributionsStatus; /** * @var 字符串 * * @ORM\Column(name="catchupContributionStatus", type="text",length = 65535) */ 公共 $catchupContributionStatus; /** * @var 字符串 * * @ORM\Column(name="annualSalary", type="float",length = 255) */ 公共$年薪; /** * @var 字符串 * * @ORM\Column(name="retireAge", type="integer") */ 公共 $retireAge; /** * @var 字符串 * * @ORM\Column(name="preTaxSavingRate", type="float",length = 255) */ 公共 $preTaxSavingRate; /** * @var 字符串 * * @ORM\Column(name="postTaxSavingRate", type="float",length = 255) */ 公共 $postTaxSavingRate; /** * @var 字符串 * * @ORM\Column(name="rothTaxSavingRate", type="float",length = 255) */ 公共 $rothTaxSavingRate; /** * @var 字符串 * * @ORM\Column(name="mStarContribution", type="text",length = 65535) */ 公共 $mStarContribution; /** * @var 字符串 * * @ORM\Column(name="mStarStatus", type="text",length = 65535) */ 公共 $mStarStatus; /** * @var 字符串 * * @ORM\Column(name="smart401kStatus", type="text",length = 65535) */ 公共 $smart401kStatus; /** * @var 字符串 * * @ORM\Column(name="reportDate", type="datetime") */ 公共 $reportDate; /** * @var 字符串 * * @ORM\Column(name="profileId", type="string", 长度 = 50) */ 公共 $profileId; /** * @var 字符串 * * @ORM\Column(name="acceptedAdvice", type="text",length = 65535) */ 公共 $acceptedAdvice; /** * @var 字符串 * * @ORM\Column(name="ACAOptOutStatus", type="text",length = 65535) */ 公共 $ACAOptOutStatus; /** * @var 字符串 * * @ORM\Column(name="profilestatus", type="smallint") */ 公共 $profilestatus; /** * @var 字符串 * * @ORM\Column(name="可用性", type="string",length = 250) */ 公共$可用性; /** * @var 字符串 * * @ORM\Column(name="clientCalling", type="string",length = 50) */ 公共 $clientCalling; /** * @var 字符串 * * @ORM\Column(name="mstarQuit", type="smallint" ) */ 公共 $mstarQuit; /** * @var 字符串 * * @ORM\Column(name="rkdData", type="text",length = 65535 ) */ 公共$rkdData; /** * @var 字符串 * * @ORM\Column(name="welcomeVideo", type="string",length = 63 ) */ 公共 $welcomeVideo; /** * @var 字符串 * * @ORM\Column(name="planBasicVideo", type="string",length = 127 ) */ 公共 $planBasicVideo; /** * @var 字符串 * * @ORM\Column(name="uniqid", type="string",length = 63 ) */ 公共$uniqid; /** * @var 字符串 * * @ORM\Column(name="migration", type="smallint") */ 公共$迁移; 命名空间类\classBundle\Entity; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * 参与者 * * @ORM\Table() * @ORM\实体 */ 课堂参与者 /** * @ORM\OneToMany(targetEntity="profiles", mappedBy="participant") * */ public $profiles;//配置文件数组 /** * @var 整数 * * @ORM\Column(name="id", type="integer") * @ORM\ID * @ORM\GeneratedValue(strategy="AUTO") */ 公共$id; /** * @var 字符串 * * @ORM\Column(name="firstName", type="blob", 长度 = 127) */ 公共 $firstName; /** * @var 字符串 * * @ORM\Column(name="lastName", type="blob", 长度 = 127) */ 公共$姓氏; /** * @var 字符串 * * @ORM\Column(name="legalName", type="blob", 长度 = 255) */ 公共 $legalName; /** * @var 字符串 * * @ORM\Column(name="地址", type="blob", 长度 = 255) */ 公共$地址; /** * @var 字符串 * * @ORM\Column(name="city", type="string", length = 50) */ 公共$城市; /** * @var 字符串 * * @ORM\Column(name="state", type="string", length = 50) */ 公共$状态; /** * @var 字符串 * * @ORM\Column(name="zip", type="string", length = 10) */ 公共 $zip; /** * @var 字符串 * * @ORM\Column(name="maritalStatus", type="blob", 长度 = 63) */ 公共 $maritalStatus; /** * @var 字符串 * * @ORM\Column(name="employmentDate", type="blob", 长度 = 127) */ 公共 $employmentDate; /** * @var 字符串 * * @ORM\Column(name="birthDate", type="blob", 长度 = 127) */ 公共 $birthDate; /** * @var 字符串 * * @ORM\Column(name="employeeId", type="blob", 长度 = 255) */ 公共$employeeId; /** * @var 字符串 * * @ORM\Column(name="email", type="blob", 长度 = 255) */ 公共$电子邮件; /** * @var 字符串 * * @ORM\Column(name="phone", type="string",length = 50) */ 公共$电话;

【问题讨论】:

【参考方案1】:

是的,它失败了,因为您的架构中的条目或条目数违反了您的外键约束。这与您的映射或学说 ORM 无关。这是一个 sql 返回的错误,不,您不能强制它跳过任何失败的条目,因为教义只是数据库的抽象层。无论如何,这是外键的全部意义,以保持数据完整性。

对不起,我觉得我有责任告诉您,找到违反您的约束的那些表条目并相应地处理它们符合您的最大利益。下次您的客户尝试对数据库执行任何操作时,他将无法执行任何操作,除非他知道自己在做什么,并且应该这样做。

【讨论】:

如果你想破坏一切,你可以手动使用:SET FOREIGN_KEY_CHECKS=0;你的 SQL (...) SET FOREIGN_KEY_CHECKS=1;

以上是关于Symfony2 教义关联映射错误处理的主要内容,如果未能解决你的问题,请参考以下文章

检查教义关系是不是正确

坚持时的教义关联完整性约束

在 Symfony2 中检测实体配置错误

教义自引用关联映射(Symfony)

教义 2 - 具有附加属性和继承的关联表

教义自定义数据类型