首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在包中提供映射信息,但允许实体类被覆盖

如何在包中提供映射信息,但允许实体类被覆盖
EN

Stack Overflow用户
提问于 2015-03-09 20:18:05
回答 1查看 1.3K关注 0票数 0

我在Symfony中开发应用程序已经有几年了,但是还没有深入研究独立的包开发,它现在让我很不爽。

我想要做的是提供一些预定义的实体,使用应用程序可以安装这些实体,但是如果需要的话,可以用它们自己的实体类覆盖。

这是我提供的两张桌子

src/My/CustomBundle/Resources/config/doctrine/User.orm.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="My\CustomBundle\Entity\User" table="user">
    <id name="id" type="integer" column="id">
      <generator strategy="IDENTITY"/>
    </id>
    <field name="username" type="string" column="username" length="16" nullable="false"/>
    <field name="email" type="string" column="email" length="255" nullable="true"/>
    <one-to-many field="properties" target-entity="My\CustomBundle\Entity\UserProperty" mapped-by="user" fetch="EAGER" />
  </entity>
</doctrine-mapping>

src/My/CustomBundle/Resources/config/doctrine/User.orm.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="My\CustomBundle\Entity\UserProperty" table="user_property">
    <indexes>
      <index name="fk_user_property_user1_idx" columns="user_id"/>
    </indexes>
    <unique-constraints>
      <unique-constraint columns="user_id,key" name="user_key_UNIQUE" />
    </unique-constraints>
    <id name="id" type="integer" column="id">
      <generator strategy="IDENTITY"/>
    </id>
    <field name="key" type="string" column="`key`" length="45" nullable="false"/>
    <field name="value" type="string" column="`value`" length="255" nullable="true"/>
    <many-to-one field="user" target-entity="My\CustomBundle\Entity\User" inversed-by="properties">
      <join-column name="user_id" referenced-column-name="id" nullable="false"/>
    </many-to-one>
  </entity>
</doctrine-mapping>

我只是使用这些工具从这些映射自动生成实体类,所以我不会为这些类发布代码,因为它们是非常可预测的。

然后,当我尝试从另一个包中使用这些实体时,问题就出现了。例如。

src/AppBundle/Entity/User.php

代码语言:javascript
复制
<?php

namespace AppBundle\Entity;

use My\CustomBundle\Entity\User as BaseUser;

class User extends BaseUser {}

现在,这总是提示错误。

代码语言:javascript
复制
[Doctrine\ORM\Mapping\MappingException]                                                                                           
  Class "AppBundle\Entity\User" sub class of "My\CustomBundle\Entity\User" is not a valid entity or mapped super class. 

如果我试图告知教义,AppBundle\Entity\User是一个实体,就像这样

代码语言:javascript
复制
<?php

namespace AppBundle\Entity;

use My\CustomBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * User
 *
 * @ORM\Entity
 */
class User extends BaseUser {}

那么这也失败了。

代码语言:javascript
复制
[Doctrine\DBAL\Schema\SchemaException]              
  The table with name 'database.user' already exists.

是否有一个合理的方法来提供预映射的实体,但也允许消费应用程序覆盖他们的需要?

版本信息

  • PHP 5.4.16
  • Symfony 2.6.4
  • 原则(共同) 2.4.2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-09 21:26:17

如果您使用的是原则,则需要使用单个表继承,或者使用映射的超类。

以下是参考文档:

单表继承

映射Superlcass

请注意,原则还有其他类型的继承,但它们并不完全适用于这个用例。它们是:

类表继承

覆盖

如果您的用例不属于这些类别之一,您基本上需要从头开始创建自己的实体,并自行处理所有关联、映射等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28950993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档