【问题标题】:Discriminator problems with Doctrine 2Doctrine 2 的鉴别器问题
【发布时间】:2011-05-03 13:53:53
【问题描述】:

我正在使用类表继承策略与 D2 实现继承映射。我有一个名为 Person 的父类,其代码块如下

namespace Zain\Entity;
/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="Specialty", type="string") // what other types exist?
 * @DiscriminatorMap({"person" = "\Zain\Person", "employee" = "\Staff\Entities\Employee"})
 *  
 * @Table(name="db_One.tblPerson")
 *
 */
class Person
{

...

我有一个名为 Employee 的子类,代码如下:

namespace Staff\Entities;

/**
 * Description of Employee
 * @Entity
 * @Table(name="db_Two.tblEmployee")
 * 
 */

class Employee extends \Zain\Entity\Person
{

...

MySQL 表:tblPerson 有一个名为 Specialty 的鉴别器列,定义为:

`Specialty` varchar(45) NOT NULL

当我有一个 Employee 实例并尝试持久化它时,就会出现问题。

当 Employee 实例被持久化时,我希望对象名称、employee(字符串)将保存在表 Person 的 Specialty 列中。 然而,这并没有发生。我遇到错误消息:

Message: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'specialty' cannot be null

我了解此错误意味着没有为 EntityManager 生成和使用的 SQL 语句中的 Specialty 列传递任何值。我在 tblPerson > Specialty Column 上设置了 Not Null 约束。

如果我删除了非空约束,我可以让它工作——但这​​违背了目的。为了解决这个问题,您能否告诉我如何检索生成的 SQL 语句,该语句在持久调用期间由实体管理器使用/将使用?

很高兴能在几天的寻找答案中画上一个圆满的句号。再次感谢。

【问题讨论】:

    标签: php orm doctrine-orm


    【解决方案1】:

    Doctrine 支持多种类型。 DiscriminatorMap 中主要使用的是字符串和整数(及其派生类:bigint、smallint、float...)。

    嗯,对我来说,问题似乎是您所指的班级名称。 类名的字符串表示总是指向根命名空间,所以在开头包含“\”只会给你带来麻烦。 我建议你删除它并检查它是否有效。

    【讨论】:

    • 但未解决的请求是:在帮助解决这个问题时,您能否告诉我如何检索生成的 SQL 语句,该语句在持久调用期间由实体管理器使用/将使用?
    • @pi - 您需要为教义配置 SQL 记录器。详情在这里:doctrine-project.org/docs/orm/2.0/en/reference/…
    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多