如何在连接请求Laravel中使用查询范围?

时间:2016-09-27 20:23:43

标签: laravel laravel-5.2 laravel-5.3

我有以下要求:

$objects = Object::with("translate")->where(function ($query) use ($request) {
$query->language();

})->with('images')->with("category")->orderBy('id', 'desc')->paginate($limit);

因此,在模型Object中有方法:translate

public function translate()
{
   return $this->hasMany("App\ObjectTranslate", "objectId", "id");
}

所以,在这个模型中也是:

public function scopeLanguage($query)
    {
        $languageHeader = new ModelLibrary();

        return $query->where('language', '=', $languageHeader->getLanguage());
    }

当我尝试在主要请求中调用范围时:

$query->language();

我收到SQL错误:

Column not found: 1054 Unknown column 'language' in 'where clause' (SQL: 

1 个答案:

答案 0 :(得分:0)

您需要使用ObjectTranslate的表加入查询。您的scopeLanguage()函数将无法工作,因为您正在尝试访问对象模型列中不可用的列语言。

注意:用()只会急切加载,这会加载雄辩定义的函数,你不能直接在where子句中访问它们的列。

修改scopeLanguage函数

public function scopeLanguage($query)
{
    $languageHeader = new ModelLibrary();

    return $query->join('object_translate_table','object_translate_table.objectId','=','object_table.id')->where('object_translate_table.language',$languageHeader->getLanguage());

}

$objects = Object::with("translate","images","category") 
                   ->language() 
                   ->orderBy('id', 'desc')
                   ->paginate($limit);

这应该有效

  

Assumin ObjectTranslate模型的表名是object_translate_table,对象模型的表名是object_table

相关问题