我对过滤器查询有一些问题。我需要做一些像
这样的想法 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_slug'位于'艺术家'表中
我做
$this['painting'] = Painting::whereHas('artist', function($q)
{
$q->where('artist_slug', '=', $this->param('slug'));
})->get();
但我不知道接下来该做什么。 我怎样才能在php代码中查询?
答案 0 :(得分:0)
我会从艺术家的角度解决这个问题:
$artist = Artists::where('artist_slug', $this->param('slug'))->with('paintings')->first();
可以使用$artist->paintings
访问艺术家的所有绘画,这将是Collection
。
答案 1 :(得分:0)
短而脏:
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