我已经为我的映射文件尝试了这个目录结构:
/config/doctrine/Place.orm.yml
/config/doctrine/Place/Type.orm.yml
/config/doctrine/Place/Price.orm.yml
并在我的映射文件中指向相应的实体,如下所示:
Project\TestBundle\Entity\Place\Type:
type: entity
table: place_type
id:
id:
type: integer
generator: { strategy:AUTO }
fields:
name:
type: string
length: 255
但这会返回错误。系统似乎无法检测到实体的映射文件。
答案 0 :(得分:15)
长话短说,这是可能的。
如果您的捆绑包的Entity文件夹中有文件夹结构,那么它很简单。您必须使用Entity命名空间下面的实体命名空间部分命名您的ORM文件,并将\
替换为.
。
因此,例如,如果您拥有Project\TestBundle\Entity\Place\Type
实体,则ORM文件(位于包内的config/doctrine
文件夹中)将具有名称Place.Type.orm.yml
。
如果你想从Entity文件夹外部(甚至在bundle文件夹之外)使用Doctrine实体类,它会有点复杂,但仍然可能。 Doctrine Bundle允许在其配置中为您的类定义自定义映射位置。
再次 - 例子。如果您的实体位于Project\Test
命名空间内(位于文件夹src/Project/Test
中),则可以像这样定义映射:
应用程序/配置/配置* .yml
doctrine:
orm:
MyCustomDomain:
mapping: true
type: yml
dir: %kernel.root_dir%/config/projecttest
alias: ProjectTest
prefix: Project\Test
is_bundle: false
事实上,Doctrine Bundle会自动执行类似操作,这就是为什么您可以将所有类放在Entity子文件夹中而不再担心的原因。
前缀是名称空间前缀。 Folder是包含配置文件的文件夹的路径。别名很有趣 - 它允许在DQL查询和映射文件中使用更简单的对象名称。 Symfony的TestBundle:Test
语法在同一个前提下工作 - TestBundle
是TestBundle中所有实体的别名。 is_bundle
告诉Doctrine,这些实体不属于Symfony捆绑包,需要稍微不同的处理。
在定义自己的映射时有一些注意事项。 Mapper使用' first match'对前缀的规则。因此,如果您在太宽的名称空间前缀上声明映射,它可以覆盖其他映射。
尽管如此,它有时很有用。例如,如果您想要映射来自" foreign"库直接到Doctrine。或者正在创建一个与Symfony不完全绑定的库,并希望将一些类保留在bundle之外。
答案 1 :(得分:6)
如果您想将学说实体组织成子文件夹
例如:src/AppBundle/Entity/subfolder/MyEntity.php
然后相应的ORM文件应如下所示:
src/Resources/config/Doctrine/subfolder.MyEntity.orm.yml
不要在src/Resources/config/Doctrine/
*
*注意:如果你看一下Doctrine config docs,看起来可以使用以下命令为orm.yml文件配置不同的位置:
doctrine:
orm:
# An array of mappings, which may be a bundle name or something else
mapping_name:
mapping: true
type: ~
dir: ~
alias: ~
prefix: ~
is_bundle: ~
但我没试过这个。也许其他人可以确认改善这个答案?
答案 2 :(得分:0)
使用@ORM 注释,您只需要::class, 这是示例:
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private User $accountant;
不要忘记像这样导入用户
use App\Entity\Subfolder\User;