/** * @return string */ public function getCapName() { return Tools::capitalize($this->name); }
/** * @param self[] $objects */ public static function saveAll(array $objects) { if (count($objects) == 0) { return; } /** @var self $class */ $class = '\\' . get_called_class(); $table = $class::getTableName(); $attributes = $objects[0]->getAttributes(new \ReflectionClass($objects[0])); $nbColumns = count($attributes); $nbTotalRows = count($objects); $rowsByInsert = 0; /* Building attribute => getter list */ $attrGetter = array(); $fields = '('; foreach ($attributes as $k => $v) { if ($k != 'id' || $v != 0) { $attrGetter[$k] = 'get' . Tools::capitalize($k); $fields .= $k . ', '; } } $fields = substr($fields, 0, -2) . ')'; unset($attributes); /* Depending of how many columns we have to insert, we don't put the same rows number in a single query */ if ($nbColumns > 0 && $nbColumns <= 4) { $rowsByInsert = 50; } else { if ($nbColumns <= 10) { $rowsByInsert = 10; } else { $rowsByInsert = 2; } } $rowsInPartialInsert = $nbTotalRows % $rowsByInsert; /* Constructing queries, one for a full insertion, one for remaining rows that cannont fill a full insert */ $pdo = PDOS::getInstance(); $sql = 'INSERT INTO ' . $table . ' ' . $fields . ' VALUES '; $sqlValues1 = ''; $sqlValues2 = ''; for ($i = 0; $i < $rowsByInsert; $i++) { $sqlValues1 .= '('; if ($i < $rowsInPartialInsert) { $sqlValues2 .= '('; } foreach ($attrGetter as $k => $v) { $sqlValues1 .= ':' . $k . '_' . $i . ', '; if ($i < $rowsInPartialInsert) { $sqlValues2 .= ':' . $k . '_' . $i . ', '; } } $sqlValues1 = substr($sqlValues1, 0, -2) . '), '; if ($i < $rowsInPartialInsert) { $sqlValues2 = substr($sqlValues2, 0, -2) . '), '; } } $sqlValues1 = substr($sqlValues1, 0, -2); $sqlValues2 = substr($sqlValues2, 0, -2); $queryFull = $pdo->prepare($sql . $sqlValues1); if ($rowsInPartialInsert > 0) { $queryPartial = $pdo->prepare($sql . $sqlValues2); } else { $queryPartial = null; } /* Executing loop, filling values and executing queries */ $nbFullInserts = (int) ($nbTotalRows / $rowsByInsert); $reflection = new \ReflectionClass(get_called_class()); $pdo->beginTransaction(); $i = 0; for ($j = 0; $j < $nbFullInserts; $j++) { for ($k = 0; $k < $rowsByInsert; $k++) { $object = $objects[$i]; foreach ($attrGetter as $attr => $getter) { $method = $reflection->getMethod($getter); if ($method->isPrivate()) { $property = $reflection->getProperty('_' . $attr); $property->setAccessible(true); $val = $property->getValue($object); $property->setAccessible(false); } else { $val = $object->{$getter}(); } $queryFull->bindValue(':' . $attr . '_' . $k, is_bool($val) ? $val ? 'true' : 'false' : $val); } $i++; } $queryFull->execute(); } if ($rowsInPartialInsert > 0) { for ($k = 0; $k < $rowsInPartialInsert; $k++) { $object = $objects[$i]; foreach ($attrGetter as $attr => $getter) { $method = $reflection->getMethod($getter); if ($method->isPrivate()) { $property = $reflection->getProperty('_' . $attr); $property->setAccessible(true); $val = $property->getValue($object); $property->setAccessible(false); } else { $val = $object->{$getter}(); } $queryPartial->bindValue(':' . $attr . '_' . $k, is_bool($val) ? $val ? 'true' : 'false' : $val); } $i++; } $queryPartial->execute(); } $pdo->commit(); }
/** * @return string */ public function getClassName() { return Tools::capitalize($this->name, 4); }
/** * @return string */ public function getReturnedClassName() { return Tools::capitalize(Tools::removeSFromTableName($this->returnType)); }