protected function updateCount(IlluminateModel $model, IlluminateRelation $relation, $counterCacheConditions, $foreignKey, $counterCacheColumnName)
    {
        // Retrieve table name of relation
        $relationTableName = $relation->getModel()->getTable();

        // Generate query builder for counting entries
        // on our model. Result will be used as value when
        // we're updating the counter cache column on the relation
        $countQuery = $model->newQuery()
            ->select(DB::raw(sprintf('COUNT(%s.id)', $model->getTable())))
            ->join(
                DB::raw(sprintf('(SELECT %s.%s FROM %s) as relation', $relationTableName, $relation->getOwnerKey(), $relationTableName)),
                $relation->getQualifiedForeignKey(), '=', sprintf('relation.%s', $relation->getOwnerKey())
            )
            ->where($relation->getQualifiedForeignKey(), '=', $this->prepareValue($foreignKey));

        // If our relation has additional conditions, we'll need
        // to add them to our query builder that counts the entries
        if (is_array($counterCacheConditions)) {
            foreach ($counterCacheConditions as $conditionType => $conditionParameters) {
                foreach ($conditionParameters as $parameters) {
                    call_user_func_array([$countQuery, $conditionType], $parameters);
                }
            }
        }

        // Retrieve countQuery SQL
        // and prepare for binding replacements
        $countQuerySql = str_replace(['%', '?'], ['%%', '%s'], $countQuery->toSql());

        // Fire the update query
        // to update counter cache column
        return (bool) $relation->getBaseQuery()->update([
            sprintf('%s.%s', $relationTableName, $counterCacheColumnName) => DB::raw(sprintf('(%s)', vsprintf($countQuerySql, $countQuery->getBindings()))),
        ]);
    }