背景
我有一个国际化的数据库,可以存储不同语言的字符串,如下所示:
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()
设置的内容返回产品名称(例如en
和de
)。
我刚刚开始使用Laravel的Eloquent,我不确定如何指定正确的关系(或者我实际上是否正确地执行了这种关系)。
我的尝试
我在OneToMany
和Product
之间指定了ProductTranslation
关系:
class Product extends \Eloquent {
protected $with = ['translations'];
public function translations()
{
return $this->hasMany('ProductTranslation');
}
}
这很好但会返回所有翻译(我们只想要当前的语言环境)。
然后我在OneToOne
和ProductTranslation
之间指定Language
关系:
class ProductTranslation extends \Eloquent {
protected $with = ['language'];
public function language()
{
return $this->hasOne('Language')
->where('code', App::getLocale());
}
}
我知道这不起作用,我很难接受下一步该做什么。有没有人有更清洁的方法?
答案 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如果不可能,您可以继续使用该链接描述的方法从数据库中获取翻译。最终它只返回翻译数组,而不关心你是如何构建数组,硬编码或数据库的。