Как сделать столбцы меток времени поддержки доктрины?

Я пытаюсь применить следующую миграцию:

Schema::table('users', function (Blueprint $table) {
$table->timestamp('created_at')->useCurrent()->change();
});

Но artisan говорит:

  [Doctrine\DBAL\DBALException]
Unknown column type "timestamp" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL
\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypesMap(). I
f this error occurs during database introspection then you might have forgot to register all database types for a
Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMapp
edDatabaseTypes(). If the type name is empty you might have a problem with the cache or forgot some mapping inform
ation.

Когда я пытаюсь установить mmerian/doctrine-timestamp (composer install mmerian/doctrine-timestamp), composer говорит:

  [InvalidArgumentException]
Could not find package mmerian/doctrine-timestamp at any version for your minimum-stability (stable). Check the pa
ckage spelling or your minimum-stability

Что я делаю?

UPD С composer require mmerian/doctrine-timestamp=dev-master, Я смог установить пакет, затем добавил Type::addType('timestamp', 'DoctrineTimestamp\DBAL\Types\Timestamp'); до Schema::table Скажите, но теперь у меня есть другая ошибка:

  [Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'created_at' (SQL: ALTER TABLE u
sers CHANGE created_at created_at INT DEFAULT 'CURRENT_TIMESTAMP' NOT NULL)

UPD Я проверил еще раз, если он работает с mmerian/doctrine-timestamp, поскольку я тогда добавил только первую из строк из документов (или документ был обновлен):

Type::addType('timestamp', 'DoctrineTimestamp\DBAL\Types\Timestamp');
DB::getDoctrineConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('Timestamp', 'timestamp');

Но это тоже не помогает. Миграция прошла успешно, но определение столбца не изменилось.

3

Решение

привет ~ вы можете использовать тип «datetime»:

 Schema::table('orders', function ($table) {

$table->datetime('pay_time')->nullable()->change();

});
2

Другие решения

Как видно, mmerian/doctrine-timestamp не решает проблему. Во-первых, после эта линия $table->getColumns()['created_at'] является

class Doctrine\DBAL\Schema\Column#520 (16) {
protected $_type => class Doctrine\DBAL\Types\DateTimeType#504 (0) { }
protected $_length => NULL
protected $_precision => int(10)
protected $_scale => int(0)
protected $_unsigned => bool(false)
protected $_fixed => bool(false)
protected $_notnull => bool(true)
protected $_default => string(17) "CURRENT_TIMESTAMP"protected $_autoincrement => bool(false)
protected $_platformOptions => array(0) { }
protected $_columnDefinition => NULL
protected $_comment => NULL
protected $_customSchemaOptions => array(0) { }
protected $_name => string(10) "created_at"protected $_namespace => NULL
protected $_quoted => bool(false)
}

а также $this->getTableWithColumnChanges($blueprint, $table)->getColumns()['created_at'] является

class Doctrine\DBAL\Schema\Column#533 (16) {
protected $_type => class DoctrineTimestamp\DBAL\Types\Timestamp#513 (0) { }
protected $_length => NULL
protected $_precision => int(10)
protected $_scale => int(0)
protected $_unsigned => bool(false)
protected $_fixed => bool(false)
protected $_notnull => bool(true)
protected $_default => string(17) "CURRENT_TIMESTAMP"protected $_autoincrement => bool(false)
protected $_platformOptions => array(0) { }
protected $_columnDefinition => NULL
protected $_comment => NULL
protected $_customSchemaOptions => array(0) { }
protected $_name => string(10) "created_at"protected $_namespace => NULL
protected $_quoted => bool(false)
}

Итак, сначала я не вижу информации о ON UPDATE часть здесь Во-вторых, единственная разница $_type значение. Что я могу подтвердить после эта линия, $tableDiff->changedColumns['created_at']->changedProperties является

array(1) {
[0] => string(4) "type"}

Тогда, когда порождающий ALTER TABLE заявление, все сводится к этому

public function getDefaultValueDeclarationSQL($field)
{
$default = empty($field['notnull']) ? ' DEFAULT NULL' : '';
if (isset($field['default'])) {
$default = " DEFAULT '".$field['default']."'";
if (isset($field['type'])) {
if (in_array((string) $field['type'], array("Integer", "BigInt", "SmallInt"))) {
$default = " DEFAULT ".$field['default'];
} elseif (in_array((string) $field['type'], array('DateTime', 'DateTimeTz')) && $field['default'] == $this->getCurrentTimestampSQL()) {
$default = " DEFAULT ".$this->getCurrentTimestampSQL();
} elseif ((string) $field['type'] == 'Time' && $field['default'] == $this->getCurrentTimeSQL()) {
$default = " DEFAULT ".$this->getCurrentTimeSQL();
} elseif ((string) $field['type'] == 'Date' && $field['default'] == $this->getCurrentDateSQL()) {
$default = " DEFAULT ".$this->getCurrentDateSQL();
} elseif ((string) $field['type'] == 'Boolean') {
$default = " DEFAULT '" . $this->convertBooleans($field['default']) . "'";
}
}
}
return $default;
}

Где-то вокруг эта линия там должна быть проверка для Timestamp тип повернуть 'CURRENT_TIMESTAMP' в CURRENT_TIMESTAMP, Это возможно в течение mmerian/doctrine-timestamp? Этот вопрос пока остается открытым. Эта проверка, скорее всего, решит мою конкретную проблему. Но сейчас я собираюсь сойти с рук с этим:

DB::statement('ALTER TABLE users MODIFY COLUMN created_at
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP');
1

Задавать minimum-stability установка на dev в вашем composer.json, потому что mmerian/doctrine-timestamp имеет только dev-master версия, к примеру:

{
"minimum-stability": "dev",
"require": {
...
}
}

Затем, при загрузке вашей доктрины связи:

Type::addType('timestamp', 'DoctrineTimestamp\DBAL\Types\Timestamp');
$conn->getDatabasePlatform()->registerDoctrineTypeMapping('Timestamp', 'timestamp');
0

Я построил этот для этого, так как Doctrine не хочет поддерживать это, потому что это специфичный для MySQL тип столбца.

0
По вопросам рекламы [email protected]