【问题标题】:Symfony 2 Entities relationship inter bundleSymfony 2 实体之间的关系
【发布时间】:2014-11-06 14:26:56
【问题描述】:

我尝试使用 Symfony 2 开发一个网站。 我想使用 2 个数据库。一个带有一般数据(DB_DATA),另一个带有我的应用程序数据(DB_APP)。 我制作了两个包“MyCompany\DataBundle”和“MyCompany\AppBundle”。

在“MyCompany\DataBundle”中,我声明了一个实体“Customer”,它指的是我公司的客户。 在“MyCompany\AppBundle”中有一个实体“Account”被应用程序使用并且必须引用客户。

现在它们看起来像这样:

\src\MyCompany\DataBundle\Entity\Customer.php

<?php

namespace MyCompany\DataBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Customer
 *
 * @ORM\Table(name="customer")
 * @ORM\Entity
 */
class Customer
{
    /**
     * @var integer
     *
     * @ORM\Column(name="ID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="LASTNAME", type="string", length=255, nullable=false)
     */
    private $lastName;

    /**
     * @var string
     *
     * @ORM\Column(name="FIRSTNAME", type="string", length=255, nullable=false)
     */
    private $firstName;

    ...
}

\src\MyCompany\AppBundle\Entity\Account.php

<?php

namespace MyCompany\AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Account
 *
 * @ORM\Table(name="account")
 * @ORM\Entity
 */
class Account
{
    /**
     * @var integer
     *
     * @ORM\Column(name="ID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\OneToOne(targetEntity="\MyCompany\DataBundle\Entity\Customer")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="CUSTOMER_ID", referencedColumnName="ID")
     * })
     */
    private $customer;
}

\app\config.yml

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   "%database_driver%"
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8
            appdb:
                driver:   "%database_driver2%"
                host:     "%database_host2%"
                port:     "%database_port2%"
                dbname:   "%database_name2%"
                user:     "%database_user2%"
                password: "%database_password2%"
                charset:  UTF8
    orm:
        auto_generate_proxy_classes: %kernel.debug%
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    AppBundle: 
                        type: annotation
                        mapping: true
                        dir: "%kernel.root_dir%/../src/MyCompany/AppBundle/Entity/"
                        prefix: MyCompany\AppBundle\Entity\
                        is_bundle: false
                        alias: APP
            app:
                connection: appdb
                mappings:
                    DataBundle: 
                        type: annotation
                        mapping: true
                        dir: "%kernel.root_dir%/../src/MyCompany/DataBundle/Entity/"
                        prefix: MyCompany\DataBundle\Entity\
                        is_bundle: false
                        alias: DATA

每次我尝试更新架构时,都会收到此错误:

[Doctrine\Common\Persistence\Mapping\MappingException] The class 'MyCompany\DataBundle\Entity\Customer' was not found in the chain configured namespaces MyCompany\AppBundle\Entity

【问题讨论】:

    标签: entity-framework symfony


    【解决方案1】:

    看看这一行:

    @ORM\OneToOne(targetEntity="\MyCompany\DataBundle\Entity\Customer")
    

    尝试不使用第一个“\”,因为它不在“MyCompany\AppBundle\Entity”命名空间\文件夹中:

    @ORM\OneToOne(targetEntity="MyCompany\DataBundle\Entity\Customer")
    

    如果路径是相对的,则假定它是相对于包根目录的。

    已编辑: 评论讨论后: (我的意思是这个)...在我的项目中使用 YAML,所以我的描述更短,如下所示:

     orm:
        default_entity_manager: default
        auto_generate_proxy_classes: "%kernel.debug%"
        entity_managers:
            default:
                connection: default
                mappings:
                    otherbundles: ~
        #Kernel links to history
                    KernelBundle: ~
                    HistoryBundle: ~
            history:
                connection: history
                mappings:
        #History links to kernel
                    HistoryBundle: ~
                    KernelBundle: ~
    

    在你的情况下,它看起来像这样(不确定语法):

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    AppBundle: 
                        type: annotation
                        mapping: true
                        dir: "%kernel.root_dir%/../src/MyCompany/AppBundle/Entity/"
                        prefix: MyCompany\AppBundle\Entity\
                        is_bundle: false
                        alias: APP
                    DataBundle: 
                        type: annotation
                        mapping: true
                        dir: "%kernel.root_dir%/../src/MyCompany/DataBundle/Entity/"
                        prefix: MyCompany\DataBundle\Entity\
                        is_bundle: false
                        alias: DATA
            app:
                connection: appdb
                mappings:
                    DataBundle: 
                        type: annotation
                        mapping: true
                        dir: "%kernel.root_dir%/../src/MyCompany/DataBundle/Entity/"
                        prefix: MyCompany\DataBundle\Entity\
                        is_bundle: false
                        alias: DATA
                    AppBundle: 
                        type: annotation
                        mapping: true
                        dir: "%kernel.root_dir%/../src/MyCompany/AppBundle/Entity/"
                        prefix: MyCompany\AppBundle\Entity\
                        is_bundle: false
                        alias: APP
    

    UPD:它仍然无法正常工作......并且在我阅读 this

    后似乎无法正常工作

    【讨论】:

    • 好的,尝试配置这个文件 path\app\config\config.yml 在这行之后的某个地方:# Doctrine Configuration doctrine: 描述你的 orm,像这样:orm: default_entity_manager: default default_entity_manager: default auto_generate_proxy_classes: "%kernel.debug%" entity_managers: default: connection: nameofyourconnection mappings: AppBundle: ~ DataBundle: ~ 更多信息看@ 987654322@
    • 我已经在我的配置中做到了。我编辑了我的帖子以显示我的config.yml看起来像
    • 我的意思还是不一样。您分别定义了到捆绑包的映射,这意味着捆绑包将仅在 AppBundle 内查找实体链接,或仅在 DataBundle 内查找不同的 orm 连接。您必须在 1. entity_managers->default->mappings: 和 2. entity_managers->app->mappings: 中定义关系可能位于不同的捆绑包中,在 1. 和 2 中复制有关两个捆绑包(AppBundle、DataBundle)的信息。我的项目代码中有同样的东西,它工作正常(但我使用 YAML)
    • 好消息是我不再有例外了。糟糕的是,当我使用控制台更新架构时,它会在每个数据库中创建我的所有表。 ://
    • 我也有同样的情况...看来我错了(实际上我现在正在做同样的事情并试图帮助您取得进步)...看what i found 10 月 1 日至 4 日的最后帖子...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多