Symfony 2实体关系inter bundle

时间:2014-11-06 14:26:57

标签: entity-framework symfony

我尝试使用Symfony 2开发网站。 我想使用2个数据库。一个是通用数据(DB_DATA),另一个是我的应用程序数据(DB_APP)。 我已经制作了两个捆绑包" MyCompany \ DataBundle"和" MyCompany \ AppBundle"。

In" MyCompany \ DataBundle"我已经宣布了一个实体" Customer"它引用了我公司的客户。 在" MyCompany \ AppBundle"有一个实体"帐户"应用程序使用的,必须引用客户。

现在他们看起来像这样:

\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

1 个答案:

答案 0 :(得分:0)

看看这一行:

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

首先尝试&#34; \&#34;,因为它不在&#34; MyCompany \ AppBundle \ Entity&#34;命名空间\文件夹:

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

如果path是relative,则假定它是相对于bundle root的。

<强>编辑: 评论后发言: (我的意思是)...在我的项目中使用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

之后似乎无法工作