教义命名策略未映射默认值

时间:2019-07-14 11:04:48

标签: php mysql symfony doctrine-orm doctrine

我正在使用Symfony教义捆绑包,orm扩展名。问题出在自动映射中。它映射以原则映射定义的值,但不映射未在此文件中定义的结果。 Symfony:4.3,教义-ORM:2.6,MySQL

我尝试使用不同的命名策略:下划线,默认。

实体示例类:

<?php 
class example {
    private $email;
    private $lastName;
    private $firstName;
}
?>

orm.xml:

    <entity name="example" table="users">

        <id name="id" column="id" type="integer">
            <generator strategy="AUTO" />
        </id>

        <field name="lastName" column="last_name"/>
        <field name="firstName" column="first_name"/>

    </entity>

yaml:

    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true

在示例实体中,我设置了lastName和firstName属性,但没有设置电子邮件。

1 个答案:

答案 0 :(得分:0)

naming_strategy控制如何从映射的属性名称生成列名称,但是它不会通过比较Entity及其对应的表来自动生成映射本身。 auto_mapping会自动加载您的定义。

由于您可以在实体中拥有一些属性,这些属性不会持久化到数据库中,反之亦然,因此必须定义所有映射。这样做可以使学说跟踪您的数据库架构,并通过迁移功能以新的属性/列更新您的数据库。

如果您感到懒惰并且拥有现有数据库,则还可以从中生成(或更新)您的实体。在这种情况下,所有列都将映射到实体,然后您可以删除那些对您不使用的字段。

如果要减少映射文件的详细程度,则可以删除column属性。然后,Doctrine将根据指定的naming_strategy自动生成列名。您只需在它不同于Doctrine生成的内容时对其进行显式设置。例如,由于您使用的是underscore策略,因此您可以说:

<field name="lastName"/>
<field name="firstName"/>
<field name="email"/>

这将导致您使用的映射完全相同。然后,如果您需要使用其他名称的字段,则可以通过指定column 覆盖

<field name="address" column="home_address"/>