ทำให้คอลัมน์ไม่เป็นโมฆะในการย้าย Laravel


129

ฉันกำลังเขียนการย้ายข้อมูลเพื่อสร้างคอลัมน์บางคอลัมน์ในตารางnullableในขณะนี้ สำหรับฟังก์ชั่น down ฉันต้องการสร้างคอลัมน์เหล่านั้นnot nullableอีกครั้งแน่นอน ฉันดูเอกสารตัวสร้างสคีมาแต่ไม่เห็นวิธีดำเนินการนี้

ความช่วยเหลือใด ๆ จะได้รับการชื่นชม


1
คำตอบที่สมบูรณ์ที่สุดสำหรับคำถามนี้สามารถพบได้ที่นี่: stackoverflow.com/a/32568625/4908847
szaman

คำตอบ:


233

ก่อนหน้า Laravel 5 ไม่มีวิธีดั้งเดิมของ Laravel ในการเปลี่ยนคอลัมน์ตารางที่มีอยู่โดยใช้ตัวสร้างสคีมา คุณต้องใช้การสืบค้นข้อมูลดิบสำหรับสิ่งนี้

อย่างไรก็ตามใน Laravel 5 คุณสามารถใช้:

$table->...->nullable(false)->change();

1
นั่นคือสิ่งที่ฉันพบเช่นกัน การสัมผัสที่ดีสำหรับตัวสร้างสคีมาจะอนุญาตให้แก้ไขคำจำกัดความของคอลัมน์ซึ่งดูเหมือนจะไม่รองรับ ฉันแน่ใจว่ามีคนอื่น ๆ อีกมากมายที่เป็นเหมือนตัวฉันที่ใช้ตัวสร้างสคีมาเพื่อแก้ไขฐานข้อมูลที่มีอยู่ไม่ใช่แค่สร้างตารางตั้งแต่ต้น
Sean the Bean

3
Taylor Otwell (ผู้สร้าง Laravel) กล่าวเมื่อ 6 วันที่แล้ว (2014-05-09): "ฉันยังคงยืนตามคำพูดของฉันที่ว่าถ้าใครทำได้สำเร็จและทำได้อย่างหมดจดฉันจะรวมเข้าด้วยกัน" github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan

3
@Musa เห็นได้ชัดว่าคุณสามารถตั้งค่าคอลัมน์ที่เป็นโมฆะได้ (เช่น :) $table->string('colmn', 255)->nullable()->change();แต่การย้อนกลับดูเหมือนจะไม่ทำงาน ( $table->string('colmn', 255)->change();) ดังนั้นคุณยังคงต้องใช้แบบสอบถามฐานข้อมูลดิบสำหรับสิ่งนี้
Luís Cruz

5
ดูคำตอบของ @ MattMcDonald ด้านล่าง คุณสามารถใช้ nullable () เพื่อทำให้เป็นโมฆะและเป็นโมฆะ (เท็จ) เพื่อทำให้ไม่เป็นโมฆะในการย้ายข้อมูล
ajon

6
nullable(false)ไม่ได้ผลสำหรับฉันใน Laravel 5.3 :(
Stalinko

38

ใน Laravel 5 เป็นไปได้ที่จะย้อนกลับสิ่งนี้ - เพียงแค่ส่งเท็จเป็นอาร์กิวเมนต์ไปยัง nullable ()

เช่น

$table -> string('foo') -> nullable(false) -> change();

มันได้ผล! ดังนั้นนี่จึงกลายเป็นคำตอบที่ถูกต้องเนื่องจากการอัปเดตของ Laravel
jlbang

ขอบคุณแม้ว่าฉันจะไม่เข้าใจว่าทำไมคอลัมน์ถึงไม่ทำให้เป็นโมฆะโดยค่าเริ่มต้น โดยปกติจะเป็นแนวทางปฏิบัติที่ดีที่สุดและจะเพิ่มเสียงรบกวนให้กับโค้ด
Morgan

1
คอลัมน์ไม่เป็นค่าว่างโดยค่าเริ่มต้น ผู้โพสต์ถามวิธีการย้อนกลับคอลัมน์ว่างที่มีอยู่แล้ว
Matt McDonald

3

ก่อนอื่นให้รันสิ่งนี้:

composer require doctrine/dbal

จากนั้นสร้างการย้ายข้อมูลที่จะเปลี่ยนตารางดังนี้:

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->dropColumn('column');
    });
}

4
มีเหตุผลที่จะทิ้งคอลัมน์ทั้งหมดในรูทีนย้อนกลับหรือไม่? วิธีการลง () ควรเลิกทำตรรกะของเมธอด up () เพื่อสนับสนุนการย้ายข้อมูลแบบย้อนกลับและไปข้างหน้า
Andrew

2

คุณสามารถประกาศคอลัมน์อีกครั้งโดยไม่ต้อง -> nullable () และใช้ -> เปลี่ยน

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.