Laravel雄辩,如果没有结果则更改查询

771*_*120 1 php laravel eloquent laravel-4

使用英语后备选项创建多语言网站.

我有一张桌子"语言"

__________________
|language | text |
------------------
| "EN"  | "good" |
------------------
| "NL"  | "goed" |
------------------
Run Code Online (Sandbox Code Playgroud)

我在控制器中的雄辩查询是:

Languages::language('EN')->take(1)->get(); 
Run Code Online (Sandbox Code Playgroud)

在模型语言中,我有一个范围功能:

public function scopeLanguage($query, $language)
{
    $query->where('language', '=', $language);
}
Run Code Online (Sandbox Code Playgroud)

哪作得很完美.但是当我尝试查询表中不存在的语言时.例如:

Languages::language('DE')->take(1)->get(); 
Run Code Online (Sandbox Code Playgroud)

它没有返回任何结果,但我想要回退到"EN"

我尝试过这样的事情:

public function scopeLanguage($query, $language)
{
    $query->where('language', '=', $language);
    if ($query->count() > 0) {
        return $query;
    } else {
        return $query->where('language', '=', "EN");
    }
}
Run Code Online (Sandbox Code Playgroud)

没有运气,似乎它添加了新的查询现有的.我可以删除/更改where查询吗?不破坏链(实际模型有多个范围功能)

Mar*_*łek 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

因为它正在工作,它也可以简化一点

public function scopeLanguage($query, $language)
{
    $q = clone $query;

    $q->where('language', '=', $language);
    if ($q->count() == 0) {
        $language = 'EN';
    } 
    return $query->where('language', '=', $language);
}
Run Code Online (Sandbox Code Playgroud)