2011-12-29 82 views
3

我想知道如果燃料ORM可以处理这里所描述的设计:FuelPHP ORM可以处理这个数据库设计吗?

http://www.codeproject.com/KB/aspnet/LocalizedSamplePart2/normalizedSchema.gif

下面的SQL,也许类似的东西,必须生成并执行:

SELECT CultureId 
FROM Culture WHERE CultureName = @CultureName 

SELECT I.ItemId, IL.[Name], IL.[Description], 
I.Price, CL.[Name], CL.[Description] 
FROM Item I 
INNER JOIN Item_Locale IL ON I.ItemId = IL.ItemID AND IL.CultureId = @CultureIdD 
INNER JOIN Category C ON I.CategoryId = C.CategoryId 
INNER JOIN Category_Locale CL ON C.CategoryID = CL.CategoryId AND CL.CultureId = @cultureId 
WHERE I.SellerId = @SellerID 

还是必须使用普通查询?

请指教。

+0

http://docs.fuelphp.com/packages/orm/relations/intro.html – hakre 2011-12-29 04:52:25

+0

我其实贯穿整个ORM去,但我并没有弄清楚呢。 – oaziz 2011-12-29 05:31:31

回答

6

您需要按in the link already given所述配置主键和外键。

给出的关系由示例来看是:

  • 项目HasOne Item_Locale
  • Item_Locale属于关联项目
  • 项目的hasMany分类
  • 类别属于关联项目
  • 类别HasOne Category_Locale
  • Category_Locale属于类别

用于将看起来像这样的查询:

$items = Model_Item::query() 
    ->related('locale') 
    ->related('categories') 
    ->related('categories.locale') 
    ->where('SellerID', $sellerID) 
    ->get(); 

我假设的语言环境中运行时不改,但不能硬编码。在这种情况下,您需要如下所示的内容。从设置始终是关系的一部分的默认条件开始。需要将这些添加到模型中关系的定义中,如以下Model_Item中的示例。

protected static $_has_one = array(
    'locale' => array(
     'model_to' => 'Model_Item_Locale', 
     'key_from' => 'ItemId', 
     'key_to' => 'ItemId', 
     'conditions' => array(
      'join_type' => 'inner', 
      'where' => array(), 
     ), 
    ), 
); 

我不能添加实际where条件但因为它是动态的,你不能在一个类属性定义。因此,我们将添加它的类装载毫秒:

public static function _init() 
{ 
    $culture_id = ; // get that from somewhere 
    static::$_has_one['locale']['where'][] = array('CultureId', '=', $culture_id); 
} 

这将被添加的联接,上部分每一次,旁边的PrimaryKey,外键匹配。

查询将返回一组项目,这些项目将在属性中包含语言环境信息,并且拥有一个类别数组,这些类别都有其自己的描述它们的语言环境属性。

foreach ($items as $i) 
{ 
    echo $i->locale->Name; 
    foreach ($i->categories as $c) 
    { 
     echo $c->locale->Name; 
    } 
} 
+0

这里只是一个快速提示 - $ culture_id' *必须*是一个字符串,否则ORM将它封装在反引号中,而不是由于某些原因引号。 '(string)$ culture_id'解决了这个问题。 – 2012-08-30 23:22:54