|
- <?php
-
- namespace App\Repositories;
-
- use App\Codes\UserRole;
- use App\Models\Contract;
- use App\Models\User;
- use App\Repositories\BaseRepository;
- use Illuminate\Database\Query\JoinClause;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\DB;
-
- class LoginUserRepository extends BaseRepository
- {
-
- const CONDITION_ID = 'id';
-
- const CONDITION_NAME = 'name';
- const CONDITION_ROLE = 'role';
- const CONDITION_EMAIL = 'email';
- const CONDITION_CONTRACT_ID = 'contract_id';
-
- const TABLE_USER = "user";
- const TABLE_CONTRACT = 'contract';
-
-
- /**
- * コレクションを取得する
- *
- * @param array $condition
- * @return Collection<LoginUserRepositoryData>
- */
- public function get(array $condition): Collection
- {
- $table = User::getBuilder(static::TABLE_USER);
-
- $table->leftJoinSub(Contract::getBuilder(), static::TABLE_CONTRACT, function (JoinClause $join) {
- $join->on(
- $this->makeColumnName([static::TABLE_USER, User::COL_NAME_CONTRACT_ID]),
- $this->makeColumnName([static::TABLE_CONTRACT, Contract::COL_NAME_ID])
- );
- });
-
- // -----検索条件
- // ID
- $this->where($table, $condition, static::CONDITION_ID, $this->makeColumnName([static::TABLE_USER, User::COL_NAME_ID]));
-
- // 名前
- $name = data_get($condition, static::CONDITION_NAME);
- if ($name) {
- $table->where($this->makeColumnName([static::TABLE_USER, User::COL_NAME_NAME]), 'like', "%{$name}%");
- }
-
- // EMAIL
- $email = data_get($condition, static::CONDITION_EMAIL);
- if ($email) {
- $table->where($this->makeColumnName([static::TABLE_USER, User::COL_NAME_EMAIL]), 'like', "%{$email}%");
- }
- // 契約ID
- $contractId = data_get($condition, static::CONDITION_CONTRACT_ID);
- if ($contractId) {
- $this->where($table, $condition, static::CONDITION_CONTRACT_ID, $this->makeColumnName([static::TABLE_USER, User::COL_NAME_CONTRACT_ID]));
- } else {
- // スーパー管理者
- $table->where($this->makeColumnName([static::TABLE_USER, User::COL_NAME_ROLE]), UserRole::SUPER_ADMIN);
- $table->whereNull($this->makeColumnName([static::TABLE_USER, User::COL_NAME_CONTRACT_ID]));
- }
-
- $table->select($this->columns());
-
- $main = DB::table($table, "main");
-
- // ソート
- $this->sort($main, $condition);
- $main->orderBy(static::CONDITION_ID);
-
- // リミット
- $this->limit($main, $condition);
-
-
- return LoginUserRepositoryData::makeList($main->get());
- }
-
- private function columns()
- {
- $user = static::TABLE_USER;
- $contract = static::TABLE_CONTRACT;
- $columns = [
- $this->makeColumnNameForSelect([$user, User::COL_NAME_ID]),
- $this->makeColumnNameForSelect([$user, User::COL_NAME_NAME]),
- $this->makeColumnNameForSelect([$user, User::COL_NAME_ROLE]),
- $this->makeColumnNameForSelect([$user, User::COL_NAME_EMAIL]),
-
- // 契約とログイン情報の大きい方
- DB::raw(
- sprintf(
- 'GREATEST("%s"."%s","%s"."%s") as updated_at',
- $user,
- User::COL_NAME_UPDATED_AT,
- $contract,
- Contract::COL_NAME_UPDATED_AT,
- )
- ),
- ];
-
-
- return $columns;
- }
- }
|