เพิ่มคอลัมน์ใหม่ไปยังตารางที่มีอยู่ในการย้ายข้อมูล


270

ฉันไม่สามารถหาวิธีเพิ่มคอลัมน์ใหม่ในตารางฐานข้อมูลที่มีอยู่ของฉันโดยใช้เฟรมเวิร์ก Laravel

ฉันพยายามแก้ไขไฟล์การโยกย้ายโดยใช้ ...

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

ใน terminal ผมดำเนินการและphp artisan migrate:installmigrate

ฉันจะเพิ่มคอลัมน์ใหม่ได้อย่างไร


มันจะมีประโยชน์ถ้าคุณสามารถรวมข้อผิดพลาดที่คุณได้รับ; คุณคาดหวังว่าจะเกิดอะไรขึ้น แล้วจะเกิดอะไรขึ้น
Phill Sparks

9
เป็นคำถามที่ดีมาก มีเอกสารการย้ายข้อมูลจำนวนมากอยู่ที่นั่นและมันแสดงให้คุณเห็น API และวิธีสร้างตารางในครั้งแรก จากนั้นทุกอย่างจะล้มเหลวเมื่อคุณพัฒนาแอปของคุณมากขึ้นและจำเป็นต้องแก้ไขโครงสร้างฐานข้อมูลของคุณ
Andrew Koper

คำตอบ:


611

ในการสร้างการย้ายคุณสามารถใช้การโยกย้าย: make คำสั่งบน Artisan CLI ใช้ชื่อเฉพาะเพื่อหลีกเลี่ยงการปะทะกับรุ่นที่มีอยู่

สำหรับ Laravel 3:

php artisan migrate:make add_paid_to_users

สำหรับ Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

จากนั้นคุณต้องใช้Schema::table()วิธีการ (ขณะที่คุณเข้าถึงตารางที่มีอยู่ไม่ใช่การสร้างตารางใหม่) และคุณสามารถเพิ่มคอลัมน์แบบนี้:

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('paid');
    });
}

และอย่าลืมเพิ่มตัวเลือกการย้อนกลับ:

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

จากนั้นคุณสามารถเรียกใช้การย้ายข้อมูลของคุณ:

php artisan migrate

ทั้งหมดนี้ครอบคลุมอยู่ในเอกสารสำหรับทั้ง Laravel 3:

และสำหรับ Laravel 4 / Laravel 5:

แก้ไข:

ใช้$table->integer('paid')->after('whichever_column');เพื่อเพิ่มฟิลด์นี้หลังคอลัมน์ที่ระบุ


3
Justphp artisan migrate
Phill Sparks

บางสิ่งบางอย่างที่ไม่ถูกต้อง. ฉันสร้าง "db: make" เพื่อสร้างไฟล์การโยกย้ายใหม่ จากนั้นฉันก็ใส่ Schema :: table ('users', function ($ table) {$ table-> จำนวนเต็ม ('paid');}); ลงไป และเรียกใช้ "php artisan migrate" แต่ได้รับข้อผิดพลาดร้ายแรง: ไม่สามารถประกาศคลาสใหม่ได้ผู้ใช้ใน /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php ที่บรรทัด 3
kim larsen

การสร้างการย้ายข้อมูลยังครอบคลุมอยู่ในเอกสารประกอบ คุณควรตั้งชื่อเฉพาะให้มากกว่านี้เช่น "add_paid_to_users" ด้วยวิธีนี้จะไม่ขัดแย้งกับตัวแบบจำลองของคุณ
Phill Sparks

ดูเหมือนว่า URL เอกสาร Laravel 3 ใด ๆ กำลังเปลี่ยนเส้นทางไปที่เอกสาร Laravel 4 นี่คือลิงค์ไปยัง 3 เอกสารสำหรับผู้สร้างและโยกย้าย

6
ในฐานะของ Laravel 5 ตอนนี้คำสั่งนี้จะเป็นphp artisan make:migration add_paid_to_users
mikelovelyuk

64

ฉันจะเพิ่มคำตอบของ mike3875 สำหรับผู้อ่านในอนาคตที่ใช้ Laravel 5.1 ขึ้นไป

ในการทำให้สิ่งต่าง ๆ เร็วขึ้นคุณสามารถใช้การตั้งค่าสถานะ "--table" ดังนี้:

php artisan make:migration add_paid_to_users --table="users"

วิธีนี้จะเพิ่มเนื้อหาupและdownวิธีการโดยอัตโนมัติ:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

ในทำนองเดียวกันคุณสามารถใช้--create["table_name"]ตัวเลือกเมื่อสร้างการย้ายข้อมูลใหม่ซึ่งจะเพิ่มแผ่นข้อมูลสำเร็จรูปให้กับการย้ายข้อมูลของคุณ จุดเล็ก ๆ แต่มีประโยชน์เมื่อทำการโหลดของพวกเขา!


2
นั่นไม่ใช่กรณีใน Laravel 5.0 แต่Blueprintถูกเพิ่มใน Laravel 5.1 จุดของการชี้แจงคือทั้งหมด
Phill Sparks

@PillSparks คุณพูดถูกขอบคุณขอบคุณที่เข้าใจผิด ฉันได้อัปเดตเพื่อชี้แจงเวอร์ชันที่สามารถใช้งานได้
camelCase

24

หากคุณใช้ Laravel 5 คำสั่งจะเป็นเช่นนั้น

php artisan make:migration add_paid_to_users

คำสั่งทั้งหมดสำหรับการสร้างสิ่งต่าง ๆ (ตัวควบคุมรุ่นการโยกย้าย ฯลฯ ) ถูกย้ายภายใต้ make:คำสั่ง

php artisan migrate ยังคงเหมือนเดิม


24

laravel 5.6 ขึ้นไป

ในกรณีที่คุณต้องการเพิ่มคอลัมน์ใหม่เป็นคีย์ต่างประเทศลงในตารางที่มีอยู่

สร้างการโยกย้ายใหม่โดยดำเนินการคำสั่งนี้: make: migration

ตัวอย่าง:

php artisan make:migration add_store_id_to_users_table --table=users

ในโฟลเดอร์ฐานข้อมูล / การย้ายข้อมูลคุณมีไฟล์การย้ายข้อมูลใหม่:

2018_08_08_093431_add_store_id_to_users_table.php (ดูความคิดเห็น)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

หลังจากนั้นเรียกใช้คำสั่ง:

php artisan migrate

ในกรณีที่คุณต้องการเลิกทำการโยกย้ายครั้งสุดท้ายด้วยเหตุผลใดก็ตามให้รันคำสั่งนี้:

php artisan migrate:rollback

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับการย้ายข้อมูลได้ในเอกสาร


1
คำตอบที่ครอบคลุมและเกี่ยวข้องมาก ขอบคุณ!
musicin3d

17

คุณสามารถเพิ่มคอลัมน์ใหม่ภายในSchema::createวิธีเริ่มต้นดังนี้:

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

หากคุณสร้างตารางแล้วคุณสามารถเพิ่มคอลัมน์เพิ่มเติมลงในตารางนั้นได้โดยสร้างการย้ายข้อมูลใหม่และใช้Schema::tableวิธีการ:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

เอกสารค่อนข้างละเอียดเกี่ยวกับเรื่องนี้และไม่ได้เปลี่ยนจากรุ่น 3เป็นรุ่น 4มากเกินไป


บางสิ่งบางอย่างที่ไม่ถูกต้อง. ฉันสร้าง "db: make" เพื่อสร้างไฟล์การโยกย้ายใหม่ จากนั้นฉันก็ใส่ Schema :: table ('users', function ($ table) {$ table-> จำนวนเต็ม ('paid');}); เป็นมัน และเรียกใช้ "php artisan migrate" แต่ได้รับข้อผิดพลาดร้ายแรง: ไม่สามารถประกาศคลาสใหม่ได้ผู้ใช้ใน /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php ที่บรรทัด 3
Kim larsen

คุณควรตั้งชื่อการโยกย้ายแต่ละอย่างที่ไม่ซ้ำกันเมื่อสร้างพวกเขา โดยทั่วไปจะเริ่มต้นสร้างผมจะตั้งชื่อแล้วถ้าฉันเพิ่มคอลัมน์:create_users_table add_email_password_columns_to_users
tplaner

ใช่ตามที่วิวัฒนาการบอกไว้แน่นอนว่ามันดีกว่าที่จะยึดติดกับปรัชญาการออกแบบ laravel ดั้งเดิมและใช้add_กริยาที่ด้านหน้าของแต่ละไฟล์เพื่อติดตามการเปลี่ยนแปลง "" วิธีนี้จะง่ายต่อการติดตามการเปลี่ยนแปลงสำหรับการควบคุมเวอร์ชัน ฯลฯ เนื่องจากมีการสร้างไฟล์เพิ่มใหม่สำหรับการวนซ้ำทุกครั้ง หากคุณเพิ่งไปและแก้ไข " create_" คงเป็นเรื่องยากที่จะรู้ว่าพนักงาน x คนทำบางสิ่งบางอย่างยุ่งเหยิงโดยการลบดัชนีหรือเพิ่มคอลัมน์ใหม่ ฯลฯ อย่างน้อยก็ทำให้ฉันเข้าใจ! :)
wired00

7

คุณสามารถแก้ไขไฟล์การโยกย้ายที่มีอยู่ของคุณได้ตัวอย่างเช่นการเพิ่มคอลัมน์ในตารางของคุณจากนั้นในการพิมพ์เทอร์มินัลของคุณ:

$ php artisan migrate:refresh

11
การรีเฟรชจะทำให้ตารางว่างเปล่า
JohnTaa

8
นี่เป็นอันตรายอย่างไม่น่าเชื่อ - ถ้าบางคนมีรุ่นเก่าบางคนจะมีใหม่และความสับสนวุ่นวายจะตามมา ใน Liquibase หากคุณแก้ไขไฟล์ไฟล์นั้นจะล้มเหลวเว้นแต่คุณจะใส่ข้อยกเว้นเพื่ออนุญาตและคุณสามารถทำได้ในบางกรณีเท่านั้น เช่นถ้าคุณสร้างคอลัมน์ที่ไม่เป็นโมฆะเมื่อฐานข้อมูลบางส่วนมีข้อมูลที่เป็นโมฆะอยู่แล้วมันจะแตก
John Little

3
มันจะดีกว่าถ้าคุณแก้ไขคำตอบและพูดถึงว่ามันจะทำให้โต๊ะของคุณว่างเปล่ามันจะดีกว่า
Abel

หมายเหตุ:คำสั่งนี้จะล้างตารางฐานข้อมูลทั้งหมดหากคุณต้องการใช้จากนั้นสำรองฐานข้อมูลของคุณก่อน
Udhav Sarvaiya

5

สิ่งนี้ใช้ได้กับ laravel 5.1

ก่อนอื่นบนเทอร์มินัลของคุณจะใช้รหัสนี้

php artisan make:migration add_paid_to_users --table=users

หลังจากนั้นไปที่ไดเรกทอรีโครงการของคุณและขยายฐานข้อมูลไดเรกทอรี - การโยกย้ายและแก้ไขไฟล์ add_paid_to_users.php เพิ่มรหัสนี้

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

หลังจากนั้นกลับไปที่เทอร์มินัลของคุณและดำเนินการคำสั่งนี้

php artisan migrate

หวังว่าความช่วยเหลือนี้


5

ก่อนย้อนกลับการโยกย้ายครั้งก่อนของคุณ

php artisan migrate:rollback

หลังจากนั้นคุณสามารถแก้ไขไฟล์การโยกย้ายที่มีอยู่ของคุณ (เพิ่มใหม่เปลี่ยนชื่อหรือลบคอลัมน์) จากนั้นเรียกใช้ไฟล์การโยกย้ายอีกครั้ง

php artisan migrate

0

แม้ว่าไฟล์การโยกย้ายเป็นวิธีปฏิบัติที่ดีที่สุดตามที่คนอื่นพูดถึง แต่คุณสามารถเพิ่มคอลัมน์ด้วยทิงเกอร์ได้ในเวลาสั้น ๆ

$ php artisan tinker

นี่คือตัวอย่างหนึ่งซับสำหรับเทอร์มินัล:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(ที่นี่มีการจัดรูปแบบเพื่อให้สามารถอ่านได้)

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