Создание таблицы базы данных с помощью d7.
Мой рабочий код:
$connection = Application::getConnection();
try{
$connection->createTable(
'table_name',
[
'id' => new Entity\IntegerField(
'id',
[
'column_name' => 'id'
]
),
'user_id' => new Entity\IntegerField(
'user_id',
[
'column_name' => 'user_id'
]
),
'type' => new Entity\StringField(
'type',
[
'column_name' => 'type'
]
),
'create_date' => new Entity\DatetimeField(
'create_date',
[
'column_name' => 'create_date'
]
)
],
['id'],
['id']
);
}
catch(\Exception $exception){
echo $exception->getMessage();
}
|
Не понимаю, зачем столько раз дублировать названия полей? Всё потому, что код метода $connection->createTable() далеко не идеальный:
/**
* @param string $tableName Name of the new table.
* @param ScalarField[] $fields Array with columns descriptions.
* @param string[] $primary Array with primary key column names.
* @param string[] $autoincrement Which columns will be auto incremented ones.
*
* @return void
* @throws \Bitrix\Main\ArgumentException
* @throws \Bitrix\Main\Db\SqlQueryException
*/
public function createTable($tableName, $fields, $primary = array(), $autoincrement = array())
{
$sql = 'CRE ATE TABLE '.$this->getSqlHelper()->quote($tableName).' (';
$sqlFields = array();
foreach ($fields as $columnName => $field)
{
if (!($field instanceof ScalarField))
{
throw new ArgumentException(sprintf(
'Field `%s` should be an Entity\ScalarField instance', $columnName
));
}
$realColumnName = $field->getColumnName();
$sqlFields[] = $this->getSqlHelper()->quote($realColumnName)
. ' ' . $this->getSqlHelper()->getColumnTypeByField($field)
. ' NOT NULL' // null for oracle if is not primary
. (in_array($columnName, $autoincrement, true) ? ' AUTO_INCREMENT' : '')
;
}
$sql .= join(', ', $sqlFields);
if (!empty($primary))
{
foreach ($primary as &$primaryColumn)
{
$realColumnName = $fields[$primaryColumn]->getColumnName();
$primaryColumn = $this->getSqlHelper()->quote($realColumnName);
}
$sql .= ', PRIMARY KEY('.join(', ', $primary).')';
}
$sql .= ')';
if ($this->engine)
{
$sql .= ' Engine='.$this->engine;
}
$this->query($sql);
} |
Хотя бы в аннотации к методу:
* @param ScalarField[] $fields Array with columns descriptions. |
нужно было указать, что должен передаваться именно ассоциативный массив, где ключи являются названиями полей будущей таблицы.