열이 널 입력 가능하도록 Laravel 마이그레이션 변경
unsigned로 마이그레이션을 만들었습니다 user_id
. user_id
새 마이그레이션에서 편집 하여 어떻게 만들 수 nullable()
있습니까?
Schema::create('throttle', function(Blueprint $table)
{
$table->increments('id');
// this needs to also be nullable, how should the next migration be?
$table->integer('user_id')->unsigned();
}
Laravel 5는 이제 열 변경을 지원합니다. 다음은 공식 문서의 예입니다.
Schema::table('users', function($table)
{
$table->string('name', 50)->nullable()->change();
});
출처 : http://laravel.com/docs/5.0/schema#changing-columns
Laravel 4는 열 수정을 지원하지 않으므로 원시 SQL 명령 작성과 같은 다른 기술을 사용해야합니다. 예를 들면 다음과 같습니다.
// getting Laravel App Instance
$app = app();
// getting laravel main version
$laravelVer = explode('.',$app::VERSION);
switch ($laravelVer[0]) {
// Laravel 4
case('4'):
DB::statement('ALTER TABLE `pro_categories_langs` MODIFY `name` VARCHAR(100) NULL;');
break;
// Laravel 5, or Laravel 6
default:
Schema::table('pro_categories_langs', function(Blueprint $t) {
$t->string('name', 100)->nullable()->change();
});
}
이미 데이터를 추가 한 열을 편집하려고한다고 가정하므로 데이터를 잃지 않고 열을 삭제하고 nullable 열로 다시 추가 할 수 없습니다. 우리는 alter
기존 열입니다.
그러나 Laravel의 스키마 빌더는 열 이름 바꾸기 이외의 열 수정을 지원하지 않습니다. 따라서 다음과 같이 원시 쿼리를 실행해야합니다.
function up()
{
DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
}
마이그레이션을 계속 롤백 할 수 있도록 down()
하기도합니다.
function down()
{
DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}
한 가지 참고 사항은 nullable과 nullable을 변환 할 수 없으므로 마이그레이션 전 / 후에 데이터를 정리해야합니다. 따라서 마이그레이션 스크립트에서 두 가지 방법으로 수행하십시오.
function up()
{
DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
DB::statement('UPDATE `throttle` SET `user_id` = NULL WHERE `user_id` = 0;');
}
function down()
{
DB::statement('UPDATE `throttle` SET `user_id` = 0 WHERE `user_id` IS NULL;');
DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}
미래 독자를위한 완벽한 답변입니다. 이것은 Laravel 5 이상에서만 가능합니다.
우선 교리 / dbal 패키지 가 필요합니다 .
composer require doctrine/dbal
이제 마이그레이션에서 열을 nullable로 만들 수 있습니다.
public function up()
{
Schema::table('users', function (Blueprint $table) {
// change() tells the Schema builder that we are altering a table
$table->integer('user_id')->unsigned()->nullable()->change();
});
}
이 작업을 되 돌리는 방법이 궁금 할 것입니다. 슬프게도이 구문은 지원되지 않습니다.
// Sadly does not work :'(
$table->integer('user_id')->unsigned()->change();
마이그레이션을 되 돌리는 올바른 구문입니다.
$table->integer('user_id')->unsigned()->nullable(false)->change();
Or, if you prefer, you can write a raw query:
public function down()
{
/* Make user_id un-nullable */
DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}
Hopefully you'll find this answer useful. :)
He're the full migration for Laravel 5:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->unsignedInteger('user_id')->nullable()->change();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->unsignedInteger('user_id')->nullable(false)->change();
});
}
The point is, you can remove nullable
by passing false
as an argument.
If you happens to change the columns and stumbled on
'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
then just install
composer require doctrine/dbal
Adding to Dmitri Chebotarev's answer, as for Laravel 5+.
After requiring the doctrine/dbal package:
composer require doctrine/dbal
You can then make a migration with nullable columns, like so:
public function up()
{
Schema::table('users', function (Blueprint $table) {
// change() tells the Schema builder that we are altering a table
$table->integer('user_id')->unsigned()->nullable()->change();
});
}
To revert the operation, do:
public function down()
{
/* turn off foreign key checks for a moment */
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
/* set null values to 0 first */
DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
/* alter table */
DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
/* finally turn foreign key checks back on */
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
Adding to Dmitri Chebotarev Answer,
If you want to alter multiple columns at a time , you can do it like below
DB::statement('
ALTER TABLE `events`
MODIFY `event_date` DATE NOT NULL,
MODIFY `event_start_time` TIME NOT NULL,
MODIFY `event_end_time` TIME NOT NULL;
');
Try it:
$table->integer('user_id')->unsigned()->nullable();
For Laravel 4.2, Unnawut's answer above is the best one. But if you are using table prefix, then you need to alter your code a little.
function up()
{
$table_prefix = DB::getTablePrefix();
DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
}
And to make sure you can still rollback your migration, we'll do the down()
as well.
function down()
{
$table_prefix = DB::getTablePrefix();
DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}
참고URL : https://stackoverflow.com/questions/24419999/laravel-migration-change-to-make-a-column-nullable
'Programing' 카테고리의 다른 글
수천 개의 정수를 쉼표로 문자열로 변환 (0) | 2020.05.29 |
---|---|
Java에서 소수점 이하 두 자리의 부동 소수점 데이터 출력을 표시하는 방법은 무엇입니까? (0) | 2020.05.29 |
사용자 인증없이 Instagram에서 사용자 미디어를 얻으려면 어떻게해야합니까? (0) | 2020.05.29 |
SVN에서 파일의 모든 기록 변경 사항을 보는 방법 (0) | 2020.05.28 |
Windows 7에서 ADB가 Nexus 4를 인식하지 못함 (0) | 2020.05.28 |