使用英语后备选项创建多语言网站。
我有一张桌子"语言"
__________________
|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查询吗?不破坏链(实际模型有多个范围函数)
答案 0 :(得分:6)
你可以试试这个:
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);
}
答案 1 :(得分:3)
如果您不想打破链条,可以在单独的查询中查看:
public function scopeLanguage($query, $language){
if(!self::where('language',$language)->count()){
$language = 'EN';
}
return $query->whereLanguage($language);
}
答案 2 :(得分:1)
MySQL特定的解决方案:
public function scopeLanguage($query, $language)
{
$languages = [$language, 'EN'];
$query->whereIn('language', $languages);
$query->orderByRaw('field(language, ?, ?)', $languages);
}
然后拨打first
而不是get
:
$query->language('DE')-> .... ->first();
答案 3 :(得分:0)
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");
}
}