Я создаю фильтр тегов. Пока у меня есть запрос, который возвращает продукты, теги или исполнители которых были заданы для запроса. Мне пришлось разобраться с этим, так как операторы if для фильтров тегов и авторов были беспорядочными. Запрос работает и дает мне все результаты, которые я явно запрашиваю в моем выборе. Но мне нужно заставить его загружать каждое из результатов отношений. Я попытался добавить с помощью ('tags') в микс, но он просто назначает пустую коллекцию. Я уверен, что где-то мне нужен метод with ('tags'), я не уверен, где. Или я мог быть совсем не на том пути. Мне не нужно ограничивать себя только отношением тегов (отношение один ко многим, поэтому я не могу включить его в результаты запроса).
Вот мой рычаг запроса, $tags
и $artists
- списки тегов и исполнителей.
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');
}
}