我正在使用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属性,但没有设置电子邮件。
答案 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"/>