如何在加入请求中使用查询范围Laravel?

How to use query scope in join request Laravel?

我有以下要求:

$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: 

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

注意 : With() 只是预先加载,它将加载 eloquent 定义的函数,你不能直接访问它们在 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 model's table name is object_translate_table and Object model's table name is object_table