Коротко и грязно:
Painting::where('type',input("type"))
->where('material',input("material"))
->whereHas('artist', function($q)
{
$q->where('artist_slug', '=', $this->param('slug'));
})->get();
Объяснение:
При инициализации запроса возвращается экземпляр построителя запросов. В основном все методы в построителе запросов возвращают один и тот же экземпляр, поэтому вы можете объединить их в один запрос.
Но вы также можете просто работать над построителем запросов.
$query = Painting::where('type',input("type"));
или
$query = $model->newQuery()// Where model is an intance of painting, for example new Painting();
Тогда вы можете просто работать с экземпляром построителя запросов, передавать его другим методам, которые могут что-то делать.
function getPaintings($type, $material, $slug)
{
$query = Painting::where('type',$type);
$query->where('material', $material);
$this->findArtistBySlug($query, $slug);
return $query->get()
}
function findArtistBySlug($query, $slug)
{
$query->whereHas('artist', function($q) use ($slug)
{
$q->where('artist_slug', '=', $slug);
});
$query->with(['artist']);
}
Возможно, вы захотите прочитать https://octobercms.com/docs/database/query
и https://laravel.com/docs/5.6/queries