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


ivashkevich 31.07.2018 в 17:33

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

    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 01.09.2018 в 14:10

чет сложна)

ivashkevich 01.09.2018 в 19:07

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

Sparkqy 25.09.2018 в 18:19

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

ivashkevich 25.09.2018 в 22:12

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

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

Немного не пойму, почему он числовые значения передаёт как строковые после добавления 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 25.03.2019 в 11:34

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

excent63 25.03.2019 в 13:38

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

ivashkevich 25.03.2019 в 13:45
excent63 25.03.2019 в 13:54

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

Boodoo 24.04.2019 в 11:08

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

Metey 21.07.2019 в 16:06

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

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 21.07.2019 в 19:15

Отлично

Логические задачи с собеседований