2011-12-29 44 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