我想知道Fuel ORM是否可以处理这里描述的设计:
http://www.codeproject.com/KB/aspnet/LocalizedSamplePart2/normalizedSchema.gif
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
或者我必须使用普通查询?
请指教.
解决方法:
您需要按照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-foreignkey匹配旁边添加到join-on部分.
查询将返回一组项目,这些项目将在属性中包含区域设置信息,并且具有一个类别数组,这些类别都具有描述它们的区域设置属性.
foreach ($items as $i)
{
echo $i->locale->Name;
foreach ($i->categories as $c)
{
echo $c->locale->Name;
}
}