十月 cms (laravel) where 查询

october cms (laravel) where query

我在过滤查询方面遇到了一些问题。我需要做一些像

这样的事情

select painting from artist_painting where type=$_GET['type'] AND material=$_GET['material'] and artist_slug =$_GET['artist_slug'] ORDER BY painting DESC

我有一个枢轴 table artist_painting 和艺术家。 'artist_slug' 在 'artist' table

我愿意

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

解释:

当您初始化一个查询时,一个查询生成器实例被 returned。基本上,查询生成器上的所有方法 return 都是同一个实例,因此您可以将它们菊花链式链接到一个查询中。
但您也可以只使用查询生成器。

$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/queryhttps://laravel.com/docs/5.6/queries