Чат Telegram
Группа ВКонтакте
Новый комментарий


ivashkevich

Пример решения домашки:

    private function insert(array $mappedProperties): void
    {
        $filteredProperties = array_filter($mappedProperties);

        $columns = [];
        $paramsNames = [];
        $params2values = [];
        foreach ($filteredProperties as $columnName => $value) {
            $columns[] = '`' . $columnName. '`';
            $paramName = ':' . $columnName;
            $paramsNames[] = $paramName;
            $params2values[$paramName] = $value;
        }

        $columnsViaSemicolon = implode(', ', $columns);
        $paramsNamesViaSemicolon = implode(', ', $paramsNames);

        $sql = 'INSERT INTO ' . static::getTableName() . ' (' . $columnsViaSemicolon . ') VALUES (' . $paramsNamesViaSemicolon . ');';

        $db = Db::getInstance();
        $db->query($sql, $params2values, static::class);
        $this->id = $db->getLastInsertId();
        $this->refresh();
    }

    private function refresh(): void
    {
        $objectFromDb = static::getById($this->id);
        $reflector = new \ReflectionObject($objectFromDb);
        $properties = $reflector->getProperties();

        foreach ($properties as $property) {
            $property->setAccessible(true);
            $propertyName = $property->getName();
            $this->$propertyName = $property->getValue($objectFromDb);
        }
    }
Ilon

чет сложна)

ivashkevich

дебаггер в помощь)

Sparky

Можно плиз краткое объяснение, как работает refresh()? :) потому что "чет сложна)" реально ахаха

ivashkevich

Он берет версию объекта из базы, получает все его свойства.
Затем бежит в цикле по этим свойствам и:

  1. делает их публичными;
  2. читает их имя;
  3. в текущем объекте (у которого вызвали refresh) свойству с таким же именем задаёт значение из свойства, взятого у объекта из базы ($objectFromDb).
excent63

Немного не пойму, почему он числовые значения передаёт как строковые после добавления refresh();

object(MyProject\Models\Articles\Article)[6]
  protected 'name' => string 'Новая Статья' (length=23)
  protected 'text' => string 'Новый техт' (length=19)
  protected 'authorId' => string '1' (length=1)
  protected 'createdAt' => string '2019-03-24 20:57:08' (length=19)
  protected 'id' => string '3' (length=1)
ivashkevich

Потому что из базы так возвращаются.

excent63

Понял, спасибо!

ivashkevich
excent63

О спасибо! Обязательно прочту

Boodoo

Тяжеловато вошло....

Metey

А так можно делать??

public function insert(array $mappedProperties): void
    {
        $filteredProperties = array_filter($mappedProperties);

        $columns = [];
        $paramsNames = [];
        $params2values = [];
        foreach ($filteredProperties as $columnName => $value) {
            $columns[] = '`' . $columnName. '`';
            $paramName = ':' . $columnName;
            $paramsNames[] = $paramName;
            $params2values[$paramName] = $value;
        }

        $columnsViaSemicolon = implode(', ', $columns);
        $paramsNamesViaSemicolon = implode(', ', $paramsNames);

        $sql = 'INSERT INTO ' . static::getTableName() . ' (' . $columnsViaSemicolon . ') 
                    VALUES (' . $paramsNamesViaSemicolon . ');';

        $db = Db::getInstance();
        $db->query($sql, $params2values, static::class); 
        $this->id = $db->getLastInsertId();
        $this->refresh();
    }

    public function refresh(): void
    {
        $objFromDb = static::getById($this->id);

        $properties = get_object_vars($objFromDb);

        foreach ($properties as $key=>$value) {
            $this->$key = $value;
        }
    }
ivashkevich

Отлично

Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Логические задачи с собеседований