制作一个多语言网站,并提供英语后备选项。
我有一张"语言"表
__________________
|language | text |
------------------
| "EN" | "good" |
------------------
| "NL" | "goed" |
------------------
我在控制器中雄辩的查询是:
Languages::language('EN')->take(1)->get();
在模型语言中,我有一个作用域函数:
public function scopeLanguage($query, $language)
{
$query->where('language', '=', $language);
}
这是完美的。但是当我试图查询一种表中不存在的语言时。例如:
Languages::language('DE')->take(1)->get();
它没有返回任何结果,但我想回退到"EN"
我试过这样的东西:
public function scopeLanguage($query, $language)
{
$query->where('language', '=', $language);
if ($query->count() > 0) {
return $query;
} else {
return $query->where('language', '=', "EN");
}
}
运气不好的话,它似乎在现有查询的基础上添加了新的where查询。我可以删除/更改where查询吗?。在不破坏链的情况下(实际模型具有多个作用域函数)
你可能会尝试一下:
public function scopeLanguage($query, $language)
{
$q = clone $query;
$q->where('language', '=', $language);
if ($q->count() > 0) {
return $query->where('language', '=', $language);
} else {
return $query->where('language', '=', "EN");
}
}
由于它正在工作,它也可以简化一点
public function scopeLanguage($query, $language)
{
$q = clone $query;
$q->where('language', '=', $language);
if ($q->count() == 0) {
$language = 'EN';
}
return $query->where('language', '=', $language);
}
如果你不想破坏链,你可以在一个单独的查询上检查它:
public function scopeLanguage($query, $language){
if(!self::where('language',$language)->count()){
$language = 'EN';
}
return $query->whereLanguage($language);
}
public function scopeLanguage($query, $language)
{
$countQuery = clone $query;
$countQuery->where('language', '=', $language);
if ($countQuery->count() > 0) {
return $query->where('language', '=', $language);
} else {
return $query->where('language', '=', "EN");
}
}
MySQL特定解决方案:
public function scopeLanguage($query, $language)
{
$languages = [$language, 'EN'];
$query->whereIn('language', $languages);
$query->orderByRaw('field(language, ?, ?)', $languages);
}
则调用first
而不是get
:
$query->language('DE')-> .... ->first();