映射的超类Symfony2.2



我创建了一个Bundle(名为MYBUNDLE),只有两个实体:Menu和Group。两者都声明为mappedSuperclass,因为我需要这个bundle可以用于其他项目。作为条件,项目必须从这些类扩展,通过设置表名或添加一些字段来定制它们。例如:

类到MYBUNDLE:

class Group{        
    protected $id;
    protected $menus;
}
class Menu{        
    protected $id;
    protected $groups;
}

从MYBUNDLE

映射实体的YML
ProjectMYBUNDLEEntityMenu:
    type: mappedSuperclass    
    fields:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
ProjectMYBUNDLEEntityGroup:
    type: mappedSuperclass
    fields:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    manyToMany:
        menus:
            targetEntity: Menu
            joinTable:
                name: sf_group_menu
                joinColumns:
                    sf_group_id:
                        referencedColumnName: id
                inverseJoinColumns:
                    sf_menu_id:
                        referencedColumnName: id

类到我的子包:

use ProjectMYBUNDLEEntityGroup as TGroup;
/**
 * @ORMEntity
 * @ORMTable(name="sf_group")
 */
class Group extends TGroup
{ }
use ProjectMYBUNDLEEntityMenu as TMenu;
/**
 * @ORMEntity
 * @ORMTable(name="sf_menu")
 */
class Menu extends TMenu
{ }

然而,这两个类中的每一个都有一个属性,可以在它们之间建立多多关联(因为mapappedsuperclass不允许反向,所以我的关联是多多单向的)。

我需要在MYBUNDLE中做一个查询。用多多关联连接两个表的查询。我想在MYBUNDLE中做这个查询的原因是因为这个bundle有一个服务,它在Group或Groups中绘制菜单。这个方法应该从这个bundle中得到方便,这样其他bundle就可以使用它,而不必在每个子bundle中实现。

我的部分解决方案是为我的MYBUNDLE做一个配置部分,类似于:
mybundle:
    menu_entity: 
        name: MyprojectChildBundleEntityMenu
    group_entity:
        name: MyprojectChildBundleEntityGroup
有了这样的配置,我就可以在MYBUNDLE中使用子bundle的存储库了:
$this->em->getRepository("MyprojectChildBundle:Group")-findAll();

一切工作时,我做一个查询没有连接。另一方面,当我这样做时:

$repo = $this->em->getRepository("MyprojectChildBundle:Group");
$result = $repo->createQueryBuilder("c")          
               ->select('c, d')
               ->join("c.menus", "d")->getQuery()->getResult();

return $result

一切都失败了,因为SQL试图寻找一个名为"Menu"的表,而这个表不存在,因为它被称为"sf_menu"。表组被正确地更改为"sf_group",因为我正在使用我的孩子的存储库。但是,使用此存储库只能更改该类的名称,而不能更改已连接表的名称。

我如何在MYBUNDLE中进行这种查询?非常感谢。

我终于找到了解决办法:)

我必须创建2个类作为我的模型。这些类应该具有所有映射数据库,并且应该像这样声明为单继承:

#srcMyprojectMYBUNDLEModelMenu
/**
 * @ORMEntity
 * @ORMInheritanceType("SINGLE_TABLE")
 * @ORMDiscriminatorColumn(name="discr", type="string")
 * @ORMDiscriminatorMap({"menu1" = "MyprojectMYBUNDLEEntityMenu", "menu2" = "Menu"})
 */
abstract class Menu {
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;
    // Other fields
}

,你应该做的两个实体(菜单和组)。这种实现的优点是,由于将它们声明为mappedsuperclass,您不会像以前那样丢失任何关联。

然后你应该为每个模型类声明一个实体,并将它们声明为MappedSuperClass。它们应该是这样的:

#srcMyprojectMYBUNDLEEntityMenu
use DoctrineORMMapping as ORM;
use TixproTMenuBundleModelMenu as BaseMenu;
/** @ORMMappedSuperclass */
class Menu extends BaseMenu
{
}

使用此实现,您可以确保不会丢失任何关联。此外,任何实体都可以从实体类扩展,以添加更多字段并自定义它们。例如:

#srcProjectChildBundleEntityMenu
use MyprojectMYBUNDLEEntityMenu as TMenu;
/**
 * @ORMEntity
 * @ORMTable(name="sf_menu")
 */
class Menu extends TMenu{
    //put your code here
}

不要忘记在配置文件中配置参数。使用MYBUNDLE。

mybundle:
    menu_entity: 
        name: MyprojectChildBundleEntityMenu
    group_entity:
        name: MyprojectChildBundleEntityGroup

如果你不这样做,你就不能知道MYBUNDLE中的存储库,因此你就不能对你的MYBUNDLE进行join查询。

最后,在设置参数并实现之后,您就可以在MYBUNDLE中使用联合查询了,如下所示:

$repo = $this->em->getRepository("MyprojectChildBundle:Menu");
$result = $repo->createQueryBuilder("wa")          
    ->select('wa, da')
    ->join("wa.roles", "da")

相关内容

  • 没有找到相关文章

最新更新