Laravel Eloquent可以简单地解决很多关系问题

时间:2014-11-30 09:34:46

标签: php laravel laravel-4 internationalization eloquent

背景

我有一个国际化的数据库,可以存储不同语言的字符串,如下所示:

products
    id
    price

product_translation
    id
    product_id
    language_id
    name
    description

languages
    id
    name (e.g. 'English', 'German')
    code (e.g. 'en', 'de')

为每个表(Product,ProductTranslation,Language)提供适当的模型。在我的观点中,我想获取这样的产品列表:

// get first 20 products, list name and price.
@foreach(Product::take(20)->get() as $product)
{{$product->translations->name}} {{$product->price}}
@endforeach

问题

我的应用会根据当前App::getLocale()设置的内容返回产品名称(例如ende)。

我刚刚开始使用Laravel的Eloquent,我不确定如何指定正确的关系(或者我实际上是否正确地执行了这种关系)。

我的尝试

我在OneToManyProduct之间指定了ProductTranslation关系:

class Product extends \Eloquent {

    protected $with = ['translations'];

    public function translations()
    {
        return $this->hasMany('ProductTranslation');
    }
}

这很好但会返回所有翻译(我们只想要当前的语言环境)。

然后我在OneToOneProductTranslation之间指定Language关系:

class ProductTranslation extends \Eloquent {

    protected $with = ['language'];

    public function language()
    {
        return $this->hasOne('Language')
        ->where('code', App::getLocale());
    }
}

我知道这不起作用,我很难接受下一步该做什么。有没有人有更清洁的方法?

2 个答案:

答案 0 :(得分:0)

class ProductTranslation extends \Eloquent {

    protected $with = ['language'];

    public function language()
    {
        return $this->hasOne('Language');
    }
}

在路线或控制器中

ProductTranslation::language()->where('code', '=', App::getLocale())->get();

要将其保留在模型中,请执行此操作

public static function getLocale() 
{
    return static::language()->where('code', '=', App::getLocale())->get();;
}

使用ProductTranslation::getLocale()

调用该函数

答案 1 :(得分:0)

Laravel有内置的翻译系统,只需一点点工作就可以使它与数据库一起工作,但这可能不是它的设计目的。

您无法获取所需的关系,因为关系基于ID(外键),而不是字符串约束或类似关系。

在您的视图中,您可以考虑使用filter()过滤掉那些不适合您所需语言代码的内容:http://laravel.com/docs/4.2/eloquent#collections

或者您可以考虑将翻译移动到硬编码的正确位置:http://laravel.com/docs/4.2/localization如果不可能,您可以继续使用该链接描述的方法从数据库中获取翻译。最终它只返回翻译数组,而不关心你是如何构建数组,硬编码或数据库的。