giftcon_dev/app/Models/MemInfo.php
2026-01-15 11:15:26 +09:00

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));
}
}