Symfony Doctrine:在请求中使用真实的tablename

时间:2013-06-20 22:43:05

标签: sql symfony doctrine entity

我在symfony项目中使用了doctrine并且我遇到了一些问题。

我有一个“角色”实体和一个“设备”实体。

角色只能在他身上佩戴5件装备。 但他可以买一些其他设备,放入他的库存。通过这种方式,他可以将他的一台设备换成另一台设备。

所以,在我的“角色”实体中,我有:

/**
 * @ORM\ManyToMany(targetEntity="rs\WelcomeBundle\Entity\Equipment", cascade={"persist"})
 * @ORM\JoinTable(name="InventoryCharacter")
*/
    private $inventory;

/**
 * @ORM\ManyToMany(targetEntity="rs\WelcomeBundle\Entity\Equipment", cascade={"persist"})
 * @ORM\JoinTable(name="EquipmentWearCharacter")
 */
    private $equipementsWear;

问题是:我想获得角色尚未购买的设备清单。 事实上,我想获得完整列表中的设备列表(设备中的findAll),但不在字符库存列表中。

我尝试做一个请求,但是学说不知道表“InventoryCharacter”,因为没有相应的实体类...... 所以我不能做“从库存字符中选择p ...”

我该怎么办?我想指定在真实数据库中搜索,而不是在实体类列表中搜索...

1 个答案:

答案 0 :(得分:0)

与Doctrine的'ManyToMany'关系非常透明。除了获取一个或另一个的实体列表之外,你不能做任何事情。

如果您发现自己需要访问“关系”表,要么添加关于关系的额外数据(例如创建时间)或应用过滤器(例如最近创建的),您需要自己创建该关系实体。即CharacterInventory。并在3个实体之间建立OneToMany和ManyToOne关系。

希望这有帮助。

+++++++++++编辑+++++++++++

如果您只想检索用户可以购买的所有设备(即尚未购买),您实际上不需要创建中间实体CharacterInventory:

/**
 * Add this to the Equipment Entity
 *
 * @ORM\ManyToMany(targetEntity="rs\WelcomeBundle\Entity\Character", cascade={"persist"})
 * @ORM\JoinTable(name="InventoryCharacter")
*/
private $characters;                

然后你可以用它来查询你想要的东西:

$dql = "SELECT s FROM rs\WelcomeBundle\Entity\Equipment s LEFT JOIN s.characters ct WHERE ct != :character";
$found = $em->createQuery($dql)
            ->setParameter('character', $characterEntityObject)
            ->getResult();