【问题标题】:Symfony Doctrine : Use real tablename in requestSymfony Doctrine:在请求中使用真实的表名
【发布时间】:2013-06-24 14:36:24
【问题描述】:

我在一个 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...”

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

【问题讨论】:

  • 查看 Doctrine 2 手册的 DBAL 部分。但是你最好制作实体并使用 orm 的东西。

标签: sql symfony doctrine entity


【解决方案1】:

与 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();

【讨论】:

  • 感谢您的遮阳篷!我不明白你的第一句话......我可以得到库存中的设备列表,以及设备的完整列表,但是我如何区分两个学说集合?谢谢
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2021-06-06
  • 2018-08-18
  • 2017-12-01
  • 1970-01-01
  • 2016-04-29
  • 2014-12-13
相关资源
最近更新 更多