110 lines
3.3 KiB
PHP
110 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Support\Carbon;
|
|
|
|
class MemInfo extends Model
|
|
{
|
|
protected $table = 'mem_info';
|
|
protected $primaryKey = 'mem_no';
|
|
public $incrementing = true;
|
|
protected $keyType = 'int';
|
|
|
|
// mem_info는 created_at/updated_at 컬럼이 dt_reg/dt_mod 라서 기본 timestamps 안 씀
|
|
public $timestamps = false;
|
|
|
|
/**
|
|
* 대량 컬럼이지만, 일단 자주 쓰는 것만 명시
|
|
* (전체를 fillable로 열어두지 마. 보안상 위험)
|
|
*/
|
|
protected $fillable = [
|
|
'stat_1','stat_2','stat_3','stat_4','stat_5',
|
|
'name','name_first','name_mid','name_last',
|
|
'birth','gender','native',
|
|
'cell_corp','cell_phone','email','pv_sns',
|
|
'bank_code','bank_name','bank_act_num','bank_vact_num',
|
|
'rcv_email','rcv_sms','rcv_push',
|
|
'login_fail_cnt',
|
|
'dt_login','dt_reg','dt_mod',
|
|
'dt_rcv_email','dt_rcv_sms','dt_rcv_push',
|
|
'dt_stat_1','dt_stat_2','dt_stat_3','dt_stat_4','dt_stat_5',
|
|
'ip_reg','ci_v','ci','di',
|
|
'country_code','country_name',
|
|
'admin_memo','modify_log',
|
|
];
|
|
|
|
protected $casts = [
|
|
'birth' => 'date',
|
|
'dt_login' => 'datetime',
|
|
'dt_reg' => 'datetime',
|
|
'dt_mod' => 'datetime',
|
|
'dt_vact' => 'datetime',
|
|
'dt_dor' => 'datetime',
|
|
'dt_ret_dor' => 'datetime',
|
|
'dt_out' => 'datetime',
|
|
'dt_rcv_email' => 'datetime',
|
|
'dt_rcv_sms' => 'datetime',
|
|
'dt_rcv_push' => 'datetime',
|
|
'dt_stat_1' => 'datetime',
|
|
'dt_stat_2' => 'datetime',
|
|
'dt_stat_3' => 'datetime',
|
|
'dt_stat_4' => 'datetime',
|
|
'dt_stat_5' => 'datetime',
|
|
|
|
// JSON 컬럼 (DB CHECK(json_valid()) 걸려있으니 array cast 쓰면 편함)
|
|
'admin_memo' => 'array',
|
|
'modify_log' => 'array',
|
|
];
|
|
|
|
/*
|
|
* ========== Scopes ==========
|
|
*/
|
|
|
|
public function scopeActive(Builder $q): Builder
|
|
{
|
|
// CI에서 stat_3 == 3 접근금지 / 4 탈퇴신청 / 5 탈퇴완료
|
|
return $q->whereNotIn('stat_3', ['3','4','5']);
|
|
}
|
|
|
|
public function scopeByEmail(Builder $q, string $email): Builder
|
|
{
|
|
return $q->where('email', strtolower($email));
|
|
}
|
|
|
|
/**
|
|
* ⚠️ cell_phone이 "암호화 저장"이라면
|
|
* 이 scope는 "정규화 컬럼(cell_phone_hash / cell_phone_norm 등)" 생긴 뒤에 완성하는 게 맞음.
|
|
* 지금은 자리만 만들어 둠.
|
|
*/
|
|
public function scopeByPhoneLookup(Builder $q, string $phoneNormalized): Builder
|
|
{
|
|
// TODO: cell_phone이 암호화라면 단순 where 비교 불가
|
|
// 예시(추천): cell_phone_hash 컬럼을 만들고 SHA256 같은 값으로 매칭
|
|
// return $q->where('cell_phone_hash', hash('sha256', $phoneNormalized . config('app.key')));
|
|
return $q;
|
|
}
|
|
|
|
/*
|
|
* ========== Helpers ==========
|
|
*/
|
|
|
|
public function isBlocked(): bool
|
|
{
|
|
return $this->stat_3 === '3';
|
|
}
|
|
|
|
public function isWithdrawnOrRequested(): bool
|
|
{
|
|
return in_array($this->stat_3, ['4','5'], true);
|
|
}
|
|
|
|
public function isFirstLogin(): bool
|
|
{
|
|
if (!$this->dt_login || !$this->dt_reg) return false;
|
|
return Carbon::parse($this->dt_login)->equalTo(Carbon::parse($this->dt_reg));
|
|
}
|
|
}
|