public function scopeWithoutAllTags(Builder $query, $tags, bool $includeUntagged = false): Builder
    {
        /** @var TagService $service */
        $service = app(TagService::class);
        $normalized = $service->buildTagArrayNormalized($tags);
        $tagKeys = $service->getTagModelKeys($normalized);
        $tagKeyList = implode(',', $tagKeys);

        $alias = $this->taggableCreateNewAlias(__FUNCTION__);
        $morphTagKeyName = $this->getQualifiedRelatedPivotKeyNameWithAlias($alias);

        $query = $this->prepareTableJoin($query, 'left', $alias)
            ->havingRaw("COUNT(DISTINCT CASE WHEN ({$morphTagKeyName} IN ({$tagKeyList})) THEN {$morphTagKeyName} ELSE NULL END) < ?",
                [count($tagKeys)]);

        if (!$includeUntagged) {
            $query->havingRaw("COUNT(DISTINCT {$morphTagKeyName}) > 0");
        }

        return $query;
    }
public function scopeWithoutAllTags(Builder $query, $tags, bool $includeUntagged = false): Builder
    {
        /** @var TagService $service */
        $service = app(TagService::class);
        $normalized = $service->buildTagArrayNormalized($tags);
        $tagKeys = $service->getTagModelKeys($normalized);
        $tagKeyList = implode(',', $tagKeys);

        $alias = $this->taggableCreateNewAlias(__FUNCTION__);
        $morphTagKeyName = $this->getQualifiedRelatedPivotKeyNameWithAlias($alias);

        $query = $this->prepareTableJoin($query, 'left', $alias)
            ->havingRaw("COUNT(DISTINCT CASE WHEN ({$morphTagKeyName} IN ({$tagKeyList})) THEN {$morphTagKeyName} ELSE NULL END) < ?",
                [count($tagKeys)]);

        if (!$includeUntagged) {
            $query->havingRaw("COUNT(DISTINCT {$morphTagKeyName}) > 0");
        }

        return $query;
    }
public function scopeWithoutAllTags ( Builder $ query , $ tags , bool $ includeUntagged = false ) : Builder { /** @var TagService $service */ $ service = app ( TagService :: class ) ; $ normalized = $ service -> buildTagArrayNormalized ( $ tags ) ; $ tagKeys = $ service -> getTagModelKeys ( $ normalized ) ; $ tagKeyList = implode ( ',' , $ tagKeys ) ; $ alias = $ this -> taggableCreateNewAlias ( __FUNCTION__ ) ; $ morphTagKeyName = $ this -> getQualifiedRelatedPivotKeyNameWithAlias ( $ alias ) ; $ query = $ this -> prepareTableJoin ( $ query , 'left' , $ alias ) -> havingRaw ( "COUNT(DISTINCT CASE WHEN ({$morphTagKeyName} IN ({$tagKeyList})) THEN {$morphTagKeyName} ELSE NULL END) < ?" , [ count ( $ tagKeys ) ] ) ; if ( ! $ includeUntagged ) { $ query -> havingRaw ( "COUNT(DISTINCT {$morphTagKeyName}) > 0" ) ; } return $ query ; }
Query scope for models that do not have all of the given tags.

@param Builder $query
@param string|array $tags
@param bool $includeUntagged

@return Builder
@throws \ErrorException
Query scope for models that do not have all of the given tags .