0

我在一个 symfony 项目中使用教义,我有一个小问题。

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

角色身上只能穿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;

问题是:我想获取角色尚未购买的设备列表。实际上,我想获取完整列表中的设备列表(在设备中查找所有),但不在角色清单列表中。

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

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

4

1 回答 1

0

与 Doctrine 的“多对多”关系非常透明。除了获取其中一个或另一个的实体列表之外,您无能为力。

如果您发现自己需要访问“关系”表,以添加有关关系的额外数据(例如创建时间)或应用过滤器(例如最近创建),您需要自己创建该关系实体。即字符库存。并在 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();
于 2013-06-21T04:10:25.783 回答