我正在构建一个标签过滤器。到目前为止,我有一个查询,该查询返回已向查询提供标签或艺术家的产品。我不得不打破它,因为标签和作者过滤器的if语句一团糟。查询正在运行,并提供我在select中明确要求的所有结果。但我需要让它加载每个结果关系。我尝试将一个with('tags')放入混合,但它只分配了一个空集合。我很确定我在某处需要with('tags')方法,我不确定在哪里。或者我可能完全走错了方向。我不必将自己局限于标签关系(一对多关系,因此我不能将其包含在查询结果中)。
这是我对一个查询的咆哮,$tags
和$艺术家
是标签和艺术家的列表。
if (count($tags)) {
$tagged_products = DB::table('product_tags')
->whereIn('product_tags.tag', $tags)
->groupBy('product_tags.product_uuid')
->select('product_tags.product_uuid')
->havingRaw('count(product_tags.tag) = '.count($tags));
} else {
$tagged_products = DB::table('product_tags')
->select('product_tags.product_uuid');
}
if (count($artists)) {
$artist_products = DB::table('profiles')
->whereIn('profiles.attribution', $artists)
->select('profiles.user_uuid');
} else {
$artist_products = DB::table('products')->select('products.user_uuid');
}
$results = Product::with('tags')
->join('profiles', 'products.user_uuid', '=', 'profiles.user_uuid')
->whereIn('products.uuid', $tagged_products)->whereIn('products.user_uuid',
$artist_products)->get();
$results->dd();
如果我查询单个产品记录,我可以很好地获得标签关系的值。
以下是模型:
class Product extends Model
{
protected $fillable = [
'title', 'cost', 'description', 'thumbnail'
];
protected $primaryKey = 'uuid';
public $incrementing = FALSE;
public function tags(){
return $this->hasMany('App\ProductTag', 'product_uuid', 'uuid');
}
public function profile(){
return $this->hasOne('App\Profile', 'user_uuid', 'user_uuid');
}
}
class Profile extends Model
{
protected $fillable = [
'attribution', 'links', 'description', 'user_uuid',
];
protected $primaryKey = 'user_uuid';
public $incrementing = FALSE;
public function projects()
{
return $this->hasMany('App\Project', 'user_uuid', 'user_uuid');
}
}
class ProductTag extends Model
{
protected $fillable = [
'product_uuid', 'tag',
];
//
public function product()
{
return $this->belongsTo('App\Product', 'product_uuid', 'uuid');
}
}
您可以这样轻松地进行查询:
$results = Product::with(['tags' => function($query) use($tags){
if (count($tags)) {
$query = $query->whereIn('product_tags.tag', $tags)
->groupBy('product_tags.product_uuid')
->select('product_tags.product_uuid')
->havingRaw('count(product_tags.tag) = '.count($tags));
}
return $query;
}, 'profiles' => function($query) use($artists){
if (count($artists)) {
$query = $query->whereIn('profiles.attribution', $artists)
->select('profiles.user_uuid');
}
return $query
} ]);
记住添加2个函数标签