FuelPHP ORM可以处理这个数据库设计吗?

时间:2011-12-29 04:43:49

标签: php orm fuelphp

我想知道Fuel 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

或者我必须使用普通查询?

请告知。

1 个答案:

答案 0 :(得分:6)

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

根据给出关系的例子来判断:

  • 项目HasOne Item_Locale
  • Item_Locale BelongsTo Item
  • 项目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-foreignkey匹配旁边添加到连接部分。

查询将返回一组项目,这些项目将在属性中包含区域设置信息,并且具有一组类别,这些类别都具有描述它们的区域设置属性。

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