微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

或者我必须使用普通查询

请指教.

解决方法:

您需要按照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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐