PHP-Doctrine2:Items - Shops - ItemsAtShops - 如何使用Doctrine2方便地实现?

时间:2010-07-06 10:57:27

标签: php orm doctrine entity-relationship

不知怎的,我无法弄清楚如何实现以下关系 使用Doctrine 2语法:

我有物品和商店。每个项目有不同的价格和不同 每个商店的数量。所以,我有物品表,商店表和 ItemsAtShops表。我如何反映Doctrine中的最后一个?

我想我需要创建ItemsAtShops实体,关联ManyToOne - > Items和ManyToOne - >商店,对吧?但在这种情况下......我该怎么做 方便地获取特定商店的商品清单 给定商店的价格和数量?所以,所有这些都可以 方便迭代?

我需要渲染一个包含项目列表及其价格的页面 特定商店的数量。有一个用于显示Item的模板 那里(所有它的子属性 - 价格等)。因此,将一个对象传递给最方便 这个模板并迭代它,它的子对象(如果有的话)。

1 个答案:

答案 0 :(得分:2)

我也在学说中与这​​种场景斗争。 Rails用他们的has_many :through =>关系破坏了我,这使得这种事情变得微不足道。

你是对的,你需要三个实体:Shops,Items,ItemsAtShops使用双ManyToOne关系。

我认为ItemsAtShop看起来像:

class ItemsAtShop 
{        
   private $shop;
   private $items;
   private $quantity;
}

就查询而言,你需要动摇连接:

$queryBulder->select('ias')
            ->from(ItemsAtShop, 'ias')
            ->leftJoin('ias.Item', 'i')
            ->leftJoin('ias.Shop', 's')
            ->where('s.id = :shop_id')
            ->andWhere('i.price <= :my_price')
            ->orderBy('i.price', 'DESC');

请记住,在使用DQL时,您通常会查询整个Entity对象,这些对象将自己获取它们之间的关系。这应该会导致您可以迭代的ItemsAtShop集合。

我可能需要一些烦躁来找出正确的查询。我经常从我知道的SQL查询开始,并将其转换为DQL。