3

Fuel ORMがここで説明されている設計を処理できるかどうか疑問に思っています:

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

次の SQL または類似の 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

または、通常のクエリを使用する必要がありますか?

お知らせ下さい。

4

1 に答える 1

6

すでに示したリンクで説明されているように、主キーと外部キーを構成する必要があります。

与えられた関係の例から判断すると、次のようになります。

  • アイテムHasOneItem_Locale
  • Item_Locale BelongsTo Item
  • アイテムHasManyカテゴリ
  • カテゴリはアイテムに属します
  • カテゴリHasOneCategory_Locale
  • Category_LocaleはCategoryに属します

のクエリは次のようになります。

$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);
}

これは、主キーと外部キーの一致の隣で、毎回参加部分に追加されます。

クエリは、プロパティ内にロケール情報を持ち、それらを説明する独自のロケールプロパティを持つカテゴリの配列を持つアイテムのセットを返します。

foreach ($items as $i)
{
    echo $i->locale->Name;
    foreach ($i->categories as $c)
    {
        echo $c->locale->Name;
    }
}
于 2012-01-02T18:03:36.330 に答える