Op dit moment ben ik bezig met een query die alleen discussies moet filteren die een bepaalde tag hebben. Maar, ik kom er niet uit. Dus ik dacht, ik vraag het hier maar eens 😃
De huidige situatie is, je hebt 'hoofd-tagsen
sub-tags`. De discussies zijn aan tags gekoppeld.
Voorbeeld tags:
- tag 1
- sub tag 1
- sub tag 2
- sub tag 3
Voorbeeld discussies:
- discussie 1 met de tags: [tag 1]
- discussie 2 met de tags: [tag 1, sub tag 1, sub tag 3]
- discussie 3 met de tags: [tag 1, sub tag 2]
- discussie 4 met de tags: [tag 1]
Wat ik wil is dat de query de discussies eruit filtert die bijvoorbeeld gekoppeld staan aan de tag tag 1
en niet gekoppeld staan aan een van de sub-tags
. Voorbeeld uitkomst van de filter:
- discussie 1
- discussie 4
Ik heb de volgende code in de Gambit
staan:
protected function conditions(AbstractSearch $search, array $matches, $negate)
{
$slugs = explode(',', trim($matches[1], '"'));
$tag = Tag::where('slug', $slugs[0])->first();
// Skip
if(!$tag) return;
// Find children
$children = Tag::where('parent_id', $tag->id)->get();
$childrenIds = [];
if($children) {
foreach ($children as $childTag) {
$childrenIds[] = $childTag->id;
}
}
$search->getQuery()->where(function ($query) use ($childrenIds, $tag, $negate) {
$query->orWhereIn('discussions.id', function ($query) use ($tag, $childrenIds) {
$query->select('discussion_id')
->from('discussion_tag')
->where('tag_id', $tag->id);
$query->select('discussion_id')
->from('discussion_tag')
->whereNotIn('tag_id', $childrenIds);
}, $negate);
});
}
Hoe kan ik de query zo bouwen dat het alleen de discussies ophaalt die geen children
hebben?