我在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 ...”
我该怎么办?我想指定在真实数据库中搜索,而不是在实体类列表中搜索...
答案 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();