我想知道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
或者我必须使用普通查询?
请告知。
答案 0 :(得分:6)
您需要按照in the link already given所述配置主键和外键。
根据给出关系的例子来判断:
查询看起来像这样:
$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;
}
}