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

时间:2014-10-02 11:49:00

标签: php laravel laravel-4 eloquent

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

我有一张桌子"语言"

__________________
|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查询吗?不破坏链(实际模型有多个范围函数)

4 个答案:

答案 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");
    }
}