2010-07-06 25 views
2

不知何故,我不知道如何使用Doctrine 2语法实现以下关系 :PHP-Doctrine2:项目 - 商店 - ItemsAtShops - 如何使用Doctrine2方便地实现?

我有物品和商店。每个商品在每个商店有不同的价格和不同的 数量。所以,我有Items表,Shops表和 ItemsAtShops表。我如何反映教义中的最后一个?

我想我需要创建ItemsAtShops实体,关联ManyToOne - > Items和ManyToOne - > Shops,对吧?但在这种情况下......我如何 方便地在特定商店中以特定商店的 价格和数量获取商品列表?那么,所有这些都可以方便地重复使用 ?

我需要呈现一个页面,其中包含项目及其价格列表和 特定商店的数量。有一个模板显示项目 那里(以及它的所有子属性 - 价格等)。所以,最简单的方法是只传递一个对象到 这个模板并迭代它,它是子对象(如果有的话)。

回答

2

我在教义中也遇到过这种场景。 Rails已经让我的has_many :through =>关系变得糟糕,这使得这种事情变得微不足道。

你是对的,你需要三个实体:商店,物品,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的时候,你”通常查询整个实体对象,这些对象将自己获取关系。这应该导致您可以迭代的ItemsAtShop的集合。

我可能会不安地找出正确的查询。我经常从我熟悉的SQL查询开始,并将其转换为DQL。

相关问题