*/ class DAO extends EntityDAO { use EntityWithParent; /** @copydoc EntityDAO::$schema */ public $schema = PKPSchemaService::SCHEMA_USER_GROUP; /** @copydoc EntityDAO::$table */ public $table = 'user_groups'; /** @copydoc EntityDAO::$settingsTable */ public $settingsTable = 'user_group_settings'; /** @copydoc EntityDAO::$primaryKeyColumn */ public $primaryKeyColumn = 'user_group_id'; /** @copydoc EntityDAO::$primaryTableColumns */ public $primaryTableColumns = [ 'id' => 'user_group_id', 'contextId' => 'context_id', 'roleId' => 'role_id', 'isDefault' => 'is_default', 'showTitle' => 'show_title', 'permitSelfRegistration' => 'permit_self_registration', 'permitMetadataEdit' => 'permit_metadata_edit', ]; /** * Get the parent object ID column name */ public function getParentColumn(): string { return 'context_id'; } /** * Instantiate a new DataObject */ public function newDataObject(): UserGroup { return app(UserGroup::class); } /** * Get the total count of rows matching the configured query */ public function getCount(Collector $query): int { return $query ->getQueryBuilder() ->count(); } /** * Get a list of ids matching the configured query * * @return Collection */ public function getIds(Collector $query): Collection { return $query ->getQueryBuilder() ->select('ug.' . $this->primaryKeyColumn) ->pluck('ug.' . $this->primaryKeyColumn); } /** * Get a collection of publications matching the configured query * @return LazyCollection */ public function getMany(Collector $query): LazyCollection { $rows = $query ->getQueryBuilder() ->get(); return LazyCollection::make(function () use ($rows) { foreach ($rows as $row) { yield $row->user_group_id => $this->fromRow($row); } }); } /** * @copydoc EntityDAO::fromRow() */ public function fromRow(object $row): UserGroup { $userGroup = parent::fromRow($row); return $userGroup; } /** * @copydoc EntityDAO::insert() */ public function insert(UserGroup $userGroup): int { return parent::_insert($userGroup); } /** * @copydoc EntityDAO::update() */ public function update(UserGroup $userGroup) { parent::_update($userGroup); } /** * @copydoc EntityDAO::delete() */ public function delete(UserGroup $userGroup) { parent::_delete($userGroup); } /** * Retrieves a keyed Collection (key = user_group_id, value = count) with the amount of active users for each user group */ public function getUserCountByContextId(?int $contextId = null): Collection { return DB::table('user_groups', 'ug') ->join('user_user_groups AS uug', 'uug.user_group_id', '=', 'ug.user_group_id') ->join('users AS u', 'u.user_id', '=', 'uug.user_id') ->when($contextId !== null, fn (Builder $query) => $query->where('ug.context_id', '=', $contextId)) ->where('u.disabled', '=', 0) ->groupBy('ug.user_group_id') ->select('ug.user_group_id') ->selectRaw('COUNT(0) AS count') ->pluck('count', 'user_group_id'); } }