У меня проблема с запросом фильтра. Мне нужно что-то вроде
select painting from artist_painting where type=$_GET['type'] AND material=$_GET['material'] and artist_slug =$_GET['artist_slug'] ORDER BY painting DESC
У меня есть сводная таблица artist_painting и artist. "artist_slug" находится в таблице "исполнители"
я делаю
$this['painting'] = Painting::whereHas('artist', function($q)
{
$q->where('artist_slug', '=', $this->param('slug'));
})->get();
но я не знаю, что делать дальше. Как я могу сделать запрос в PHP-коде?
Я бы решил эту задачу с точки зрения Художника:
$artist = Artists::where('artist_slug', $this->param('slug'))->with('paintings')->first();
Доступ ко всем картинам художника можно получить с помощью $artist->paintings
, который будет Collection
.
Коротко и грязно:
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
Вы определили отношения между моделями?