Search code examples
laravellaravel-5laravel-5.3

How to use query scope in join request Laravel?


I have the following request:

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

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

So, in model Object there is method: translate:

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

So, also in this model is:

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

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

When I try to call scope in main request:

$query->language();

I get SQL error:

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

Solution

  • You need to join the query with ObjectTranslate's table. your scopeLanguage() function will not work , since you are trying to access the column language which is not available in Object model column.

    Note : With() will just eager loading, which will load the eloquent defined function, you cannot directly access their column in where clause.

    Modify your scopeLanguage function

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

    This should work

    Assumin ObjectTranslate model's table name is object_translate_table and Object model's table name is object_table