【问题标题】:ZF2 Properties name in model does not correspond to database columns模型中的 ZF2 属性名称与数据库列不对应
【发布时间】:2016-07-29 15:53:54
【问题描述】:

我有一个Usermodel,其中包含一些属性——比如说firstNameandlastName——但在我的数据库中我将​​它们存储为first_nameandlast_name

User Form 里面我用的是这样的保湿剂:

$this->setHydrator(new ClassMethods(true));

调试显示:

array(5) {
  ["firstName"] => string(13) "my first name"
  ["lastName"] => string(12) "my last name"
  ...
}

为什么数组键与数据库列不匹配,即使我使用$this->setHydrator(new ClassMethods(true));

【问题讨论】:

  • 你没有提到你的 getter 和 setter 是如何定义的,但我冒昧地猜测你有 getFirstName 和 setFirstName。这就是 ClassMethods hydrator 使用的。

标签: php forms doctrine-orm zend-framework2 hydration


【解决方案1】:

我通过在 hydrator 上设置命名策略解决了将我的数据库列映射到 User 模型的问题,这是我的代码:

$hydrator = new ClassMethods(false);
$namingStrategy = new \Zend\Hydrator\NamingStrategy\UnderscoreNamingStrategy();       
$hydrator->setNamingStrategy($namingStrategy);

【讨论】:

    【解决方案2】:

    在 Doctrine 中,您使用与数据库模型分开的对象模型,这意味着列名和属性名不一定相同。在您的实体定义中,您可以显式声明您的列名,然后 Doctrine 将确保在将更改持久化到数据库时将属性名称映射到 UnitOfWork 中的正确列名。

    您在实体定义中的 @Column 注释中声明列名,如下所示:

    /** @Column(type="string", name="first_name") */
    private $firstName;
    
    /** @Column(type="string", name="last_name") */
    private $lastName;
    

    您可以在此in the doctrine documentation chapter 4.3. Property mapping 上阅读更多信息。

    像这样,您可以拥有一个独立于数据库模型的对象模型。因此,在您的调试中,您会看到您的对象模型属性,而不是您的数据库列名。我希望这个解释可以帮助您理解这些差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多