5

在尝试定义捆绑包之间的一对多关系时,会发生以下情况:

在链配置的命名空间 Mana\SplitBundle\Entity 中找不到类“Mana\ClientBundle\Entity\Member”

更新 3:

我现在看到了相互矛盾的答案,即这种关系可以实现也不能实现。假设它可以(因为 stackoverflow 的其他人似乎已经这样做了),除了在 AppKernel.php 中注册捆绑包并在实体中输入注释之外,还需要什么配置?resolve_target_entity_listener似乎没有什么不同。

更新 2:

好吧,我知道我在这里超出了我的深度,但这是我在尝试显示客户端实体时单步执行代码时观察到的。

探查器中的错误消息

在 Mana\SplitBundle\Entity\Client#members 上指定的目标实体“Mana\ClientBundle\Entity\Member”未知或不是实体。

发生是因为 SchemaValidator 的计算$cmf->isTransient($assoc['targetEntity'])结果为 true,其中成员实体中的 targetEntity。PHPdoc 注释表明该实体的元数据未加载。如果我理解正确,这意味着没有加载有关关系的注释。但是观察变量值表明注释已被读取。

我是否完全错过了一些应该非常明显的东西?还是我在左场太远了?

更新1:

我已经确认doctrine:mapping:info会检测到不正确的 FQCN。数据夹具是正确的。对默认连接和拆分连接使用实体管理器和数据库连接是正确的。该错误仍然存​​在,并且可能发生在客户端实体中定义的任何关系(OneToMany 或 ManyToOne)中。

配置.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
            mapping_types: 
                enum:       string
          split:
            driver:   "%database_driver2%"
            host:     "%database_host2%"
            port:     "%database_port2%"
            dbname:   "%database_name2%"
            user:     "%database_user2%"
            password: "%database_password2%"
            charset:  UTF8
            mapping_types: 
                enum:       string
    entity_managers:
      default:
        connection: default
        mappings:
          ManaClientBundle: ~
      split:
        connection: split
        mappings:
          ManaSplitBundle: ~

客户实体:

/**
 * @ORM\OneToMany(targetEntity="Mana\ClientBundle\Entity\Member", mappedBy="client")
 * @ORM\OrderBy({"dob" = "ASC"})
 */
protected $members;

会员单位:

 /**
 * @ORM\ManyToOne(targetEntity="Mana\SplitBundle\Entity\Client",inversedBy="members",cascade={"remove", "persist"})
 * @ORM\JoinColumn(name="cid", referencedColumnName="id")
 * 
 */
 protected $client;

教义映射:

$ php app/console doctrine:mapping:info
Found 12 mapped entities:
[OK]   Mana\ClientBundle\Entity\Agency
[OK]   Mana\ClientBundle\Entity\Center
[OK]   Mana\ClientBundle\Entity\Contact
[OK]   Mana\ClientBundle\Entity\Contactdesc
[OK]   Mana\ClientBundle\Entity\Counties
[OK]   Mana\ClientBundle\Entity\Ethnicity
[OK]   Mana\ClientBundle\Entity\Incomehistory
[OK]   Mana\ClientBundle\Entity\Incomesrc
[OK]   Mana\ClientBundle\Entity\Member
[OK]   Mana\ClientBundle\Entity\Note
[OK]   Mana\ClientBundle\Entity\Referral
[OK]   Mana\ClientBundle\Entity\User

$ php app/console doctrine:mapping:info --em=split
Found 1 mapped entities:
[OK]   Mana\SplitBundle\Entity\Client
4

1 回答 1

3

您应该看到将关系与多个实体管理器一起使用

如果您有具有单独连接和实体管理器的单独数据库,则 Doctrine 无法管理跨捆绑关系。相反,在这种情况下,客户端实体必须驻留在相同的模式/包中,并定期从外部源刷新。

但是,如果您只有一个与数据库的连接和一个实体管理器,则您可以管理跨捆绑关系。(此处描述:跨项目实体的 OneToMany 关系(Symfony2/Doctrine)

于 2013-04-17T05:47:00.773 回答