setStates($states) ->setTable('mailboxes'); } protected State\Mailbox $stateRepository; public function getStates(): State\Mailbox { return $this->stateRepository; } public function setStates(State\Mailbox $states): Mailbox { $this->stateRepository = $states; return $this; } public function install(): void { $query = " CREATE TABLE {$this->getTable()} ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, `validity` INT UNSIGNED NOT NULL, PRIMARY KEY (`id`) )"; $this->getConnection()->query($query); } protected function fieldsForUpdate(): array { return $this->fieldsForInsert(); } protected function fieldsForInsert(): array { return [ 'name', 'validity' ]; } protected function fieldsForCreate(): array { return $this->fieldsForInsert(); } protected function valuesForInsert(Model $model): array { return [ $model->getName(), $model->getValidity() ]; } protected function defaultFind(Model $model): Model { return $this->fetchByName($model->getName()); } protected function valuesForUpdate(Model $model): array { return array_merge($this->valuesForInsert($model), [ $model->getId() ]); } protected function valuesForCreate(array $data): array { return [ $data['name'], $data['validity'] ]; } protected function defaultSearch(array $data): Model { return $this->fetchByName($data['name']); } public function load(array $row): \ProVM\Emails\Model\Mailbox { return (new \ProVM\Emails\Model\Mailbox()) ->setId($row['id']) ->setName($row['name']) ->setValidity($row['validity']) ->setStateRepository($this->getStates()); } public function fetchByName(string $name): \ProVM\Emails\Model\Mailbox { $query = "SELECT * FROM `{$this->getTable()}` WHERE `name` = ?"; return $this->fetchOne($query, [$name]); } }