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

+0

私は実際には全体のORMを通り抜けたが、私はまだそれを理解しませんでした。 – oaziz

答えて

6

in the link already givenのように主キーと外部キーを設定する必要があります。

  • 項目hasOneのItem_Locale
  • Item_Locale belongsToの項目
  • 項目hasManyのカテゴリー
  • カテゴリーbelongsToの項目
  • カテゴリー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(), 
     ), 
    ), 
); 

ダイナミックでなければならないので、実際の条件をまだ追加できませんでした。クラスプロパティ定義ではその条件を使用できません。これは、次のPrimaryKey-ForeignKeyのマッチングに、参加-に一部たびに加算されます

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

:したがって、私たちはそれクラスがロードされたミリ秒追加します。

このクエリは、プロパティ内にロケール情報を持ち、それらのすべてを記述する独自のロケールプロパティを持つカテゴリの配列を持つ一連のアイテムを返します。

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

ここで簡単に言及すると、 '$ culture_id' *は文字列でなければなりません。そうでないと、ORMはなんらかの理由で引用符ではなくバッククォートでカプセル化します。 '(string)$ culture_id'はこれを解決します。 –

関連する問題