$users = User::where('status',1);
->when($tags, function ($query, $tags ) {
return $query->whereHas(fn ($query) => $query->whereIn('name', explode(',', $tags[0]));
})
->get();
Jul 31, 2021
9
Level 5
how to query this
Hi ,I have two table users and tags. I want to get all user that has at one least tag.
tags table
user_id tag
1 php
1 laravel
2 php
controller
$tags = $request->get('tags');
on dd($tags) I get
array:1 [▼
0 => "laravel,php,js"
]
My query
$users = User::where('status',1);
$users->when($tags, function ($query, $tags ) {
return $query->where(function ($whereQuery) use ($tags ) {
foreach ($tags as $tag) {
Tag::where('tag',$tag)
}
});
});
$users = $users->get();
I am not getting expected result
Level 55
@david001 for tags you show us
array:1 [▼
0 => "laravel,php,js"
]
so, array with 1 comma-separated value. Let's take first value $tags[0] and parse it
dd(explode(',', $tags[0]));
and we will have array
array:3 [
0 => "laravel",
1 => "php",
2 => "js"
]
now we can use it in whereIn condition
$query->whereIn('name', explode(',', $tags[0]))
and now we can apply it inside whereHas relationship existance check
$query->whereHas(function ($query) use($tags){
return Tag::whereIn('name', explode(',', $tags[0]));
});
let's use it only if tags presented
->when($tags, function ($query, $tags) {
$query->whereHas('tags', function ($query) use ($tags) {
$query->whereIn('tag', explode(',', $tags[0]));
});
})
let's add this to User model query - and you will have exacty what @michaloravec wrote
$users = User::where('status', 1)->when($tags, function ($query, $tags) {
$query->whereHas('tags', function ($query) use ($tags) {
$query->whereIn('tag', explode(',', $tags[0]));
});
})->get();
What else do you expect?
Please or to participate in this conversation.