whereNull($name . "." . static::COL_NAME_DELETED_AT); } public static function getTableName(): string { return (new static)->getTable(); } public static function hasColumn(string $columnName): bool { $target = sprintf("%s::COL_NAME_%s", static::class, Str::upper($columnName)); $ret = defined($target); return $ret; } public function copy(IModelFeature $from): static { $data = $from->getAttributeKeys(); foreach ($data as $key) { $this->$key = $from->$key; } return $this; } public function getAttributeKeys(): array { return array_values(array_unique(array_merge(array_keys($this->attributesToArray()), $this->hidden))); } public function isNotSavedModel(): bool { return data_get($this, ColumnName::ID) === null; } protected $dispatchesEvents = [ 'created' => CreatedEvent::class, 'updating' => UpdatingEvent::class, 'deleted' => DeletedEvent::class, ]; // カラムが存在する項目のみfillするようオーバーライド public function fill(array $atr) { $filterd = array_filter($atr, function ($value, $key) { return static::hasColumn($key); }, ARRAY_FILTER_USE_BOTH); return parent::fill($filterd); } }