public function reload(): Model
    {
        $pk = static::$primaryKey;
        $condition = null;

        if (is_array($pk)) {

            if (count($pk) === 0) {
                $class = get_class($this);
                throw new Exception("Can not reload model of {$class}, primary key definition is incorrect, it can't be empty array");
            }

            $select = [];
            foreach ($pk as $column) {
                if (!$this->has($column)) {
                    $class = get_class($this);
                    throw new Exception("Can not reload model of {$class}, primary key column {$column} is not set in model");
                }

                $pkValue = $this->$column;
                $select[$column] = $pkValue;
            }

            $condition = $select;
            $row = static::select()->where($select)->fetchFirst();
        } else {
            if (!$this->has($pk)) {
                $class = get_class($this);
                throw new Exception("Can not reload model of {$class}, primary key {$pk} is not set in model");
            }

            $pkValue = $this->$pk;
            $condition = [$pk => $pkValue];

            $row = static::select()->where($pk, $pkValue)->fetchFirst();
        }

        if ($row === null) {
            $class = get_class($this);

            $conditions = [];
            foreach ($condition as $key => $value) {
                $conditions[] = "{$key}={$value}";
            }

            $conditions = implode(', ', $conditions);
            throw new Exception("Can not reload model of {$class}, there is no record in database under {$conditions}");
        }

        return $this->setData($row);
    }