1
51
你可以抓住
|
2
20
我使用此策略在 ,可能不是您想要的,但可能会帮助其他人。 当你打电话 刷新() ,如果唯一约束失败,则 与代码一起抛出 23000个
如果需要获取失败列的名称 使用前缀名称创建表索引,例如“unique”
不要在@Column定义中将列指定为唯一的 这似乎用一个随机的索引名覆盖了索引名。。。
重新生成表后(可能需要删除它并重新生成),您应该能够从异常消息中提取列名。
不是完美的,但它是有效的。。。 |
3
8
如果您不希望在插入之前运行SELECT查询,则只能运行flush()并捕获异常。 在Doctrine DBAL 2.3中,您可以通过查看Doctrine DBALException包装的PDO异常错误代码(对于MySQL为23000,对于Postgres为23050)来安全地检测唯一的约束错误:
|
4
4
不久前我也遇到过这个问题。主要问题不是特定于数据库的异常,而是当抛出PDOException时,EntityManager将关闭。这意味着您无法确定要刷新的数据将发生什么。但可能不会保存在数据库中,因为我认为这是在事务中完成的。
这个解决方案的问题是,它可能会生成大量对数据库的查询,因此需要进行大量优化。如果你只想在少数地方使用这种东西,我建议在可能出现重复的地方进行检查。例如,如果要创建实体并保存它:
|
5
3
UniqueEntity(â¦)
具有
我把这个答案贴在这里,但似乎很有价值,因为
原则的用户也将使用Symfony2。需要说明的是:它使用Symfony的validations类,该类在hood下使用实体存储库进行检查(是可配置的,但默认为
在实体上,可以添加注释:
我建议将此与Peter的答案结合起来,因为您的数据库模式也应该强制实现唯一性:
|
6
2
如果你只想捕捉重复的错误。你不应该只检查密码
因为这将捕获其他错误,例如字段“user”不能为空。我的解决方案是检查错误消息,如果它包含文本“重复条目”
|
7
2
$e->getMessage()回声如下: 执行“INSERT INTO(…)VALUES(?时发生异常?, ?, ?, ?)' 带参数[…]: SQLSTATE[23000]:完整性约束冲突:键“PRIMARY”的1062重复项“…” |
8
0
我想特别就PDOExceptions补充一点-- 23000错误代码是MySQL可以返回的一系列完整性约束冲突的总括代码。 因此,处理23000错误代码对于某些用例来说不够具体。 例如,您可能希望对重复记录冲突的反应不同于对丢失的外键冲突的反应。 下面是一个如何处理此问题的示例:
我意识到这并不像问题所问的那么详细,但我发现这在很多情况下非常有用,而且不是特定的教义。 |
9
0
最简单的方法应该是:
|
10
0
我用过这个,看起来很管用。它将返回特定的MySQL错误号(即,重复条目为1062),以便您可以随意处理。
我用其他一些场景测试了这个,它也会返回其他代码,比如1146(表不存在)和1054(未知列)。 |
felipetnh · 如何让原则2以字符串形式返回日期时间? 6 年前 |
Nin · 在Symfony4中注册自定义条令类型 6 年前 |
nicolallias · 无法无错误地联接实体 6 年前 |
Robert · Mysql查询时间字段之间的差异为24小时 6 年前 |
stilllife · Symfony 3多通关系空相关集合 6 年前 |