Laravel雄辩,若无结果则更改查询


Laravel eloquent, change query if no results

制作一个多语言网站,并提供英语后备选项。

我有一张"语言"表

__________________
|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();