대량 할당 가능 필드 */ protected $fillable = [ 'sender_email', 'sender_name', 'recipient_email', 'recipient_name', 'subject', 'body', 'template_type', 'extension_type', 'extension_identifier', 'source', 'status', 'error_message', 'sent_at', ]; /** * 속성 캐스팅 정의 * * @return array */ protected function casts(): array { return [ 'extension_type' => ExtensionOwnerType::class, 'sent_at' => 'datetime', ]; } /** * 템플릿 유형별 필터 스코프 * * @param Builder $query 쿼리 빌더 * @param string|null $templateType 템플릿 유형 * @return Builder */ public function scopeByTemplateType(Builder $query, ?string $templateType): Builder { if ($templateType === null) { return $query->whereNull('template_type'); } return $query->where('template_type', $templateType); } /** * 확장 타입/식별자별 필터 스코프 * * @param Builder $query 쿼리 빌더 * @param ExtensionOwnerType|null $type 확장 타입 * @param string|null $identifier 확장 식별자 * @return Builder */ public function scopeByExtension(Builder $query, ?ExtensionOwnerType $type = null, ?string $identifier = null): Builder { if ($type !== null) { $query->where('extension_type', $type); } if ($identifier !== null) { $query->where('extension_identifier', $identifier); } return $query; } /** * 발송 출처별 필터 스코프 * * @param Builder $query 쿼리 빌더 * @param string|null $source 발송 출처 * @return Builder */ public function scopeBySource(Builder $query, ?string $source): Builder { if ($source === null) { return $query->whereNull('source'); } return $query->where('source', $source); } /** * 상태별 필터 스코프 * * @param Builder $query 쿼리 빌더 * @param string $status 상태값 * @return Builder */ public function scopeByStatus(Builder $query, string $status): Builder { return $query->where('status', $status); } }