Laravel: Di chuyển dữ liệu (Migrations)


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

 

Giới thiệu

Di chuyển giống như kiểm soát phiên bản cho cơ sở dữ liệu của bạn, cho phép nhóm của bạn xác định và chia sẻ định nghĩa lược đồ cơ sở dữ liệu của ứng dụng. Nếu bạn đã từng phải yêu cầu đồng đội thêm một cột vào lược đồ cơ sở dữ liệu cục bộ của họ theo cách thủ công sau khi kéo các thay đổi của bạn từ kiểm soát nguồn, bạn đã phải đối mặt với vấn đề mà việc di chuyển cơ sở dữ liệu giải quyết.

Schema Mặt tiền Laravel cung cấp hỗ trợ bất khả tri cơ sở dữ liệu để tạo và thao tác các bảng trên tất cả các hệ thống cơ sở dữ liệu được hỗ trợ của Laravel. Thông thường, quá trình di chuyển sẽ sử dụng mặt tiền này để tạo và sửa đổi các bảng và cột cơ sở dữ liệu.

 

Tạo di chuyển

Bạn có thể sử dụng make:migration lệnh Artisan để tạo quá trình di chuyển cơ sở dữ liệu. Di chuyển mới sẽ được đặt trong database/migrationsthư mục của bạn . Mỗi tên tệp di chuyển chứa một dấu thời gian cho phép Laravel xác định thứ tự của quá trình di chuyển:

php artisan make:migration create_flights_table

Laravel sẽ sử dụng tên của quá trình di chuyển để cố gắng đoán tên của bảng và việc di chuyển có tạo một bảng mới hay không. Nếu Laravel có thể xác định tên bảng từ tên di chuyển, Laravel sẽ điền trước tệp di chuyển đã tạo với bảng được chỉ định. Nếu không, bạn có thể chỉ định bảng trong tệp di chuyển theo cách thủ công.

Nếu bạn muốn chỉ định một đường dẫn tùy chỉnh cho quá trình di chuyển đã tạo, bạn có thể sử dụng --pathtùy chọn này khi thực hiện make:migrationlệnh. Đường dẫn đã cho phải liên quan đến đường dẫn cơ sở của ứng dụng của bạn.

 

Sơ khai di chuyển có thể được tùy chỉnh bằng cách sử dụng xuất bản sơ khai .

 

 

Squashing Migrations

Khi bạn xây dựng ứng dụng của mình, bạn có thể tích lũy ngày càng nhiều di chuyển theo thời gian. Điều này có thể dẫn đến database/migrationsthư mục của bạn trở nên cồng kềnh với hàng trăm lần di chuyển. Nếu muốn, bạn có thể "ép" quá trình di chuyển của mình vào một tệp SQL duy nhất. Để bắt đầu, hãy thực hiện schema:dumplệnh:

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

Khi bạn thực hiện lệnh này, Laravel sẽ ghi một tệp "lược đồ" vào thư mục ứng dụng của bạn database/schema. Bây giờ, khi bạn cố gắng di chuyển cơ sở dữ liệu của mình và không có quá trình di chuyển nào khác được thực hiện, Laravel sẽ thực thi các câu lệnh SQL của tệp lược đồ trước. Sau khi thực hiện các câu lệnh của tệp lược đồ, Laravel sẽ thực hiện bất kỳ quá trình di chuyển nào còn lại không phải là một phần của kết xuất lược đồ.

Bạn nên cam kết tệp lược đồ cơ sở dữ liệu của mình cho quyền kiểm soát nguồn để các nhà phát triển mới khác trong nhóm của bạn có thể nhanh chóng tạo cấu trúc cơ sở dữ liệu ban đầu cho ứng dụng của bạn.

 

Migration squashing chỉ khả dụng cho cơ sở dữ liệu MySQL, PostgreSQL và SQLite và sử dụng máy khách dòng lệnh của cơ sở dữ liệu. Các kết xuất lược đồ có thể không được khôi phục vào cơ sở dữ liệu SQLite trong bộ nhớ.

 

 

Cơ cấu di chuyển

Một lớp di chuyển chứa hai phương thức: upvà down. Các upphương pháp được sử dụng để thêm bảng mới, cột, hoặc chỉ số cơ sở dữ liệu của bạn, trong khi downphương pháp nên đảo ngược các hoạt động được thực hiện bởi các upphương pháp.

Trong cả hai phương pháp này, bạn có thể sử dụng trình tạo lược đồ Laravel để tạo và sửa đổi các bảng một cách rõ ràng. Để tìm hiểu về tất cả các phương pháp có sẵn trên trình tạo Schemahãy xem tài liệu của nó . Ví dụ: quá trình di chuyển sau sẽ tạo ra một flightsbảng:

<?php

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

class CreateFlightsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('flights');
    }
}

 

Di cư ẩn danh

Như bạn có thể đã nhận thấy trong ví dụ trên, Laravel sẽ tự động gán tên lớp cho tất cả các lần di chuyển mà bạn tạo bằng make:migrationlệnh. Tuy nhiên, nếu muốn, bạn có thể trả về một lớp ẩn danh từ tệp di chuyển của mình. Điều này chủ yếu hữu ích nếu ứng dụng của bạn tích lũy nhiều lần di chuyển và hai trong số chúng có xung đột tên lớp:

<?php

use Illuminate\Database\Migrations\Migration;

return new class extends Migration
{
    //
};

 

Thiết lập kết nối di chuyển

Nếu quá trình di chuyển của bạn sẽ tương tác với kết nối cơ sở dữ liệu khác với kết nối cơ sở dữ liệu mặc định của ứng dụng, bạn nên đặt thuộc $connectiontính của quá trình di chuyển của mình:

/**
 * The database connection that should be used by the migration.
 *
 * @var string
 */
protected $connection = 'pgsql';

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    //
}

 

Chạy di cư

Để chạy tất cả các lần di chuyển chưa thực hiện của bạn, hãy thực hiện migratelệnh Artisan:

php artisan migrate

Nếu bạn muốn xem những di chuyển nào đã chạy cho đến nay, bạn có thể sử dụng migrate:statuslệnh Artisan:

php artisan migrate:status

 

Buộc di chuyển để chạy trong sản xuất

Một số hoạt động di chuyển có tính chất phá hoại, có nghĩa là chúng có thể khiến bạn mất dữ liệu. Để bảo vệ bạn khỏi việc chạy các lệnh này với cơ sở dữ liệu sản xuất của bạn, bạn sẽ được nhắc xác nhận trước khi các lệnh được thực thi. Để buộc các lệnh chạy mà không có lời nhắc, hãy sử dụng --forcecờ:

php artisan migrate --force

 

Di chuyển quay lại

Để khôi phục hoạt động di chuyển mới nhất, bạn có thể sử dụng rollbacklệnh Artisan. Lệnh này quay trở lại "đợt" di chuyển cuối cùng, có thể bao gồm nhiều tệp di chuyển:

php artisan migrate:rollback

Bạn có thể khôi phục một số lần di chuyển hạn chế bằng cách cung cấp steptùy chọn cho rollbacklệnh. Ví dụ: lệnh sau sẽ khôi phục lại năm lần di chuyển cuối cùng:

php artisan migrate:rollback --step=5

Các migrate:resetlệnh sẽ quay trở lại tất cả các cuộc di cư của ứng dụng của bạn:

php artisan migrate:reset

 

Quay lại & di chuyển bằng một lệnh duy nhất

Các migrate:refreshlệnh sẽ quay trở lại tất cả các cuộc di cư của bạn và sau đó thực hiện migratelệnh. Lệnh này tạo lại toàn bộ cơ sở dữ liệu của bạn một cách hiệu quả:

php artisan migrate:refresh

// Refresh the database and run all database seeds...
php artisan migrate:refresh --seed

Bạn có thể quay lại và di chuyển lại một số lần di chuyển hạn chế bằng cách cung cấp steptùy chọn cho refreshlệnh. Ví dụ: lệnh sau sẽ quay trở lại và di chuyển lại năm lần di chuyển cuối cùng:

php artisan migrate:refresh --step=5

 

Thả tất cả các bảng & di chuyển

Các migrate:freshlệnh sẽ thả tất cả các bảng từ cơ sở dữ liệu và sau đó thực hiện migratelệnh:

php artisan migrate:fresh

php artisan migrate:fresh --seed

 

Các migrate:freshlệnh sẽ thả tất cả các bảng cơ sở dữ liệu không phân biệt tiền tố của họ. Lệnh này nên được sử dụng thận trọng khi phát triển trên cơ sở dữ liệu được chia sẻ với các ứng dụng khác.

 

 

Những cái bàn

 

Tạo bảng

Để tạo một bảng cơ sở dữ liệu mới, hãy sử dụng createphương thức trên Schemamặt tiền. Các createphương pháp chấp nhận hai đối số: đầu tiên là tên của bảng, trong khi thứ hai là một đóng cửa mà nhận được một Blueprintđối tượng có thể được sử dụng để xác định bảng mới:

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

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email');
    $table->timestamps();
});

Khi tạo bảng, bạn có thể sử dụng bất kỳ phương thức cột nào của trình tạo lược đồ để xác định các cột của bảng.

 

Kiểm tra sự tồn tại của bảng / cột

Bạn có thể kiểm tra sự tồn tại của một bảng hoặc cột bằng cách sử dụng hasTablevà hasColumncác phương pháp:

if (Schema::hasTable('users')) {
    // The "users" table exists...
}

if (Schema::hasColumn('users', 'email')) {
    // The "users" table exists and has an "email" column...
}

 

Kết nối cơ sở dữ liệu & Tùy chọn bảng

Nếu bạn muốn thực hiện thao tác giản đồ trên kết nối cơ sở dữ liệu không phải là kết nối mặc định của ứng dụng, hãy sử dụng connectionphương pháp:

Schema::connection('sqlite')->create('users', function (Blueprint $table) {
    $table->id();
});

Ngoài ra, một số thuộc tính và phương thức khác có thể được sử dụng để xác định các khía cạnh khác của việc tạo bảng. Các enginebất động sản có thể được sử dụng để xác định công cụ lưu trữ của bảng khi sử dụng MySQL:

Schema::create('users', function (Blueprint $table) {
    $table->engine = 'InnoDB';

    // ...
});

Các thuộc tính charsetvà collationcó thể được sử dụng để chỉ định bộ ký tự và đối chiếu cho bảng đã tạo khi sử dụng MySQL:

Schema::create('users', function (Blueprint $table) {
    $table->charset = 'utf8mb4';
    $table->collation = 'utf8mb4_unicode_ci';

    // ...
});

Các temporaryphương pháp có thể được sử dụng để chỉ ra rằng bàn nên "tạm thời". Các bảng tạm thời chỉ hiển thị với phiên cơ sở dữ liệu của kết nối hiện tại và tự động bị loại bỏ khi kết nối bị đóng:

Schema::create('calculations', function (Blueprint $table) {
    $table->temporary();

    // ...
});

 

Cập nhật bảng

Các tablephương pháp trên Schemamặt tiền có thể được sử dụng để cập nhật các bảng hiện có. Giống như createphương thức, tablephương thức chấp nhận hai đối số: tên của bảng và một bao đóng nhận một Blueprintphiên bản mà bạn có thể sử dụng để thêm cột hoặc chỉ mục vào bảng:

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

Schema::table('users', function (Blueprint $table) {
    $table->integer('votes');
});

 

Đổi tên / Bỏ bảng

Để đổi tên một bảng cơ sở dữ liệu hiện có, hãy sử dụng renamephương pháp:

use Illuminate\Support\Facades\Schema;

Schema::rename($from, $to);

Để loại bỏ một bảng hiện có, bạn có thể sử dụng drophoặc dropIfExistscác phương pháp:

Schema::drop('users');

Schema::dropIfExists('users');

 

Đổi tên bảng bằng phím ngoại

Trước khi đổi tên bảng, bạn nên xác minh rằng bất kỳ ràng buộc khóa ngoại nào trên bảng đều có tên rõ ràng trong tệp di chuyển của bạn thay vì để Laravel gán tên dựa trên quy ước. Nếu không, tên ràng buộc khóa ngoại sẽ tham chiếu đến tên bảng cũ.

 

Cột

 

Tạo cột

Các tablephương pháp trên Schemamặt tiền có thể được sử dụng để cập nhật các bảng hiện có. Giống như createphương thức, tablephương thức chấp nhận hai đối số: tên của bảng và một bao đóng nhận một Illuminate\Database\Schema\Blueprintthể hiện mà bạn có thể sử dụng để thêm cột vào bảng:

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

Schema::table('users', function (Blueprint $table) {
    $table->integer('votes');
});

 

Các loại cột có sẵn

Kế hoạch chi tiết của trình tạo lược đồ cung cấp nhiều phương pháp tương ứng với các loại cột khác nhau mà bạn có thể thêm vào các bảng cơ sở dữ liệu của mình. Mỗi phương pháp có sẵn được liệt kê trong bảng dưới đây:

 

bigIncrements()

Các bigIncrementsphương pháp tạo ra một auto-incrementing UNSIGNED BIGINTcột tương đương (khóa chính):

$table->bigIncrements('id');

 

bigInteger()

Các bigIntegerphương pháp tạo ra một BIGINTcột tương đương:

$table->bigInteger('votes');

 

binary()

Các binaryphương pháp tạo ra một BLOBcột tương đương:

$table->binary('photo');

 

boolean()

Các booleanphương pháp tạo ra một BOOLEANcột tương đương:

$table->boolean('confirmed');

 

char()

Các charphương pháp tạo ra một CHARcột tương đương với một chiều dài nhất định:

$table->char('name', 100);

 

dateTimeTz()

Các dateTimeTzphương pháp tạo ra một DATETIME(với múi giờ) cột tương đương với một độ chính xác tùy chọn (tổng số):

$table->dateTimeTz('created_at', $precision = 0);

 

dateTime()

Các dateTimephương pháp tạo ra một DATETIMEcột tương đương với một độ chính xác tùy chọn (tổng số):

$table->dateTime('created_at', $precision = 0);

 

date()

Các datephương pháp tạo ra một DATEcột tương đương:

$table->date('created_at');

 

decimal()

Các decimalphương pháp tạo ra một DECIMALcột tương đương với độ chính xác nhất định (tổng số) và quy mô (số thập phân chữ số):

$table->decimal('amount', $precision = 8, $scale = 2);

 

double()

Các doublephương pháp tạo ra một DOUBLEcột tương đương với độ chính xác nhất định (tổng số) và quy mô (số thập phân chữ số):

$table->double('amount', 8, 2);

 

enum()

Các enumphương pháp tạo ra một ENUMcột tương đương với giá trị hợp lệ cho:

$table->enum('difficulty', ['easy', 'hard']);

 

float()

Các floatphương pháp tạo ra một FLOATcột tương đương với độ chính xác nhất định (tổng số) và quy mô (số thập phân chữ số):

$table->float('amount', 8, 2);

 

foreignId()

Các foreignIdphương pháp tạo ra một UNSIGNED BIGINTcột tương đương:

$table->foreignId('user_id');

 

foreignIdFor()

Các foreignIdForphương pháp bổ sung thêm một {column}_id UNSIGNED BIG INTcột tương đương với một model class đưa ra:

$table->foreignIdFor(User::class);

 

foreignUuid()

Các foreignUuidphương pháp tạo ra một UUIDcột tương đương:

$table->foreignUuid('user_id');

 

geometryCollection()

Các geometryCollectionphương pháp tạo ra một GEOMETRYCOLLECTIONcột tương đương:

$table->geometryCollection('positions');

 

geometry()

Các geometryphương pháp tạo ra một GEOMETRYcột tương đương:

$table->geometry('positions');

 

id()

Các idphương pháp là một bí danh của bigIncrementsphương pháp. Theo mặc định, phương thức sẽ tạo một idcột; tuy nhiên, bạn có thể chuyển một tên cột nếu bạn muốn gán một tên khác cho cột:

$table->id();

 

increments()

Các incrementsphương pháp tạo ra một auto-incrementing UNSIGNED INTEGERcột tương đương như một khóa chính:

$table->increments('id');

 

integer()

Các integerphương pháp tạo ra một INTEGERcột tương đương:

$table->integer('votes');

 

ipAddress()

Các ipAddressphương pháp tạo ra một VARCHARcột tương đương:

$table->ipAddress('visitor');

 

json()

Các jsonphương pháp tạo ra một JSONcột tương đương:

$table->json('options');

 

jsonb()

Các jsonbphương pháp tạo ra một JSONBcột tương đương:

$table->jsonb('options');

 

lineString()

Các lineStringphương pháp tạo ra một LINESTRINGcột tương đương:

$table->lineString('positions');

 

longText()

Các longTextphương pháp tạo ra một LONGTEXTcột tương đương:

$table->longText('description');

 

macAddress()

Các macAddressphương pháp tạo ra một cột được dùng để tổ chức một địa chỉ MAC. Một số hệ thống cơ sở dữ liệu, chẳng hạn như PostgreSQL, có kiểu cột dành riêng cho kiểu dữ liệu này. Các hệ thống cơ sở dữ liệu khác sẽ sử dụng một cột tương đương chuỗi:

$table->macAddress('device');

 

mediumIncrements()

Các mediumIncrementsphương pháp tạo ra một auto-incrementing UNSIGNED MEDIUMINTcột tương đương như một khóa chính:

$table->mediumIncrements('id');

 

mediumInteger()

Các mediumIntegerphương pháp tạo ra một MEDIUMINTcột tương đương:

$table->mediumInteger('votes');

 

mediumText()

Các mediumTextphương pháp tạo ra một MEDIUMTEXTcột tương đương:

$table->mediumText('description');

 

morphs()

Các morphsphương pháp là một phương pháp tiện lợi mà bổ sung thêm một {column}_id UNSIGNED BIGINTcột tương đương và một {column}_type VARCHARcột tương đương.

Phương pháp này nhằm mục đích được sử dụng khi xác định các cột cần thiết cho mối quan hệ Eloquent đa hình . Trong ví dụ sau, taggable_idvà taggable_typecác cột sẽ được tạo:

$table->morphs('taggable');

 

multiLineString()

Các multiLineStringphương pháp tạo ra một MULTILINESTRINGcột tương đương:

$table->multiLineString('positions');

 

multiPoint()

Các multiPointphương pháp tạo ra một MULTIPOINTcột tương đương:

$table->multiPoint('positions');

 

multiPolygon()

Các multiPolygonphương pháp tạo ra một MULTIPOLYGONcột tương đương:

$table->multiPolygon('positions');

 

nullableTimestamps()

Các nullableTimestampsphương pháp là một bí danh của timestamps phương pháp:

$table->nullableTimestamps(0);

 

nullableMorphs()

Phương pháp tương tự như phương pháp morphs ; tuy nhiên, các cột được tạo sẽ là "nullable":

$table->nullableMorphs('taggable');

 

nullableUuidMorphs()

Phương thức này tương tự như phương thức uuidMorphs ; tuy nhiên, các cột được tạo sẽ là "nullable":

$table->nullableUuidMorphs('taggable');

 

point()

Các pointphương pháp tạo ra một POINTcột tương đương:

$table->point('position');

 

polygon()

Các polygonphương pháp tạo ra một POLYGONcột tương đương:

$table->polygon('position');

 

rememberToken()

Các rememberTokenphương pháp tạo ra một nullable, VARCHAR(100)cột tương đương được dùng để lưu trữ các hiện "nhớ đến tôi" xác thực thẻ :

$table->rememberToken();

 

set()

Các setphương pháp tạo ra một SETcột tương đương với danh sách cho các giá trị hợp lệ:

$table->set('flavors', ['strawberry', 'vanilla']);

 

smallIncrements()

Các smallIncrementsphương pháp tạo ra một auto-incrementing UNSIGNED SMALLINTcột tương đương như một khóa chính:

$table->smallIncrements('id');

 

smallInteger()

Các smallIntegerphương pháp tạo ra một SMALLINTcột tương đương:

$table->smallInteger('votes');

 

softDeletesTz()

Các softDeletesTzphương pháp bổ sung thêm một nullable deleted_at TIMESTAMP(với múi giờ) cột tương đương với một độ chính xác tùy chọn (tổng chữ số). Cột này nhằm lưu trữ deleted_atdấu thời gian cần thiết cho chức năng "xóa mềm" của Eloquent:

$table->softDeletesTz($column = 'deleted_at', $precision = 0);

 

softDeletes()

Các softDeletesphương pháp bổ sung thêm một nullable deleted_at TIMESTAMPcột tương đương với một độ chính xác tùy chọn (tổng chữ số). Cột này nhằm lưu trữ deleted_atdấu thời gian cần thiết cho chức năng "xóa mềm" của Eloquent:

$table->softDeletes($column = 'deleted_at', $precision = 0);

 

string()

Các stringphương pháp tạo ra một VARCHARcột tương đương với độ dài nhất định:

$table->string('name', 100);

 

text()

Các textphương pháp tạo ra một TEXTcột tương đương:

$table->text('description');

 

timeTz()

Các timeTzphương pháp tạo ra một TIME(với múi giờ) cột tương đương với một độ chính xác tùy chọn (tổng số):

$table->timeTz('sunrise', $precision = 0);

 

time()

Các timephương pháp tạo ra một TIMEcột tương đương với một độ chính xác tùy chọn (tổng số):

$table->time('sunrise', $precision = 0);

 

timestampTz()

Các timestampTzphương pháp tạo ra một TIMESTAMP(với múi giờ) cột tương đương với một độ chính xác tùy chọn (tổng số):

$table->timestampTz('added_at', $precision = 0);

 

timestamp()

Các timestampphương pháp tạo ra một TIMESTAMPcột tương đương với một độ chính xác tùy chọn (tổng số):

$table->timestamp('added_at', $precision = 0);

 

timestampsTz()

Các timestampsTzphương pháp tạo ra created_atvà updated_at TIMESTAMP(với múi giờ) cột tương đương với một độ chính xác tùy chọn (tổng số):

$table->timestampsTz($precision = 0);

 

timestamps()

Các timestampsphương pháp tạo ra created_atvà updated_at TIMESTAMPcột tương đương với một độ chính xác tùy chọn (tổng số):

$table->timestamps($precision = 0);

 

tinyIncrements()

Các tinyIncrementsphương pháp tạo ra một auto-incrementing UNSIGNED TINYINTcột tương đương như một khóa chính:

$table->tinyIncrements('id');

 

tinyInteger()

Các tinyIntegerphương pháp tạo ra một TINYINTcột tương đương:

$table->tinyInteger('votes');

 

tinyText()

Các tinyTextphương pháp tạo ra một TINYTEXTcột tương đương:

$table->tinyText('notes');

 

unsignedBigInteger()

Các unsignedBigIntegerphương pháp tạo ra một UNSIGNED BIGINTcột tương đương:

$table->unsignedBigInteger('votes');

 

unsignedDecimal()

Các unsignedDecimalphương pháp tạo ra một UNSIGNED DECIMALcột tương đương với một độ chính xác tùy chọn (tổng số) và quy mô (số thập phân chữ số):

$table->unsignedDecimal('amount', $precision = 8, $scale = 2);

 

unsignedInteger()

Các unsignedIntegerphương pháp tạo ra một UNSIGNED INTEGERcột tương đương:

$table->unsignedInteger('votes');

 

unsignedMediumInteger()

Các unsignedMediumIntegerphương pháp tạo ra một UNSIGNED MEDIUMINTcột tương đương:

$table->unsignedMediumInteger('votes');

 

unsignedSmallInteger()

Các unsignedSmallIntegerphương pháp tạo ra một UNSIGNED SMALLINTcột tương đương:

$table->unsignedSmallInteger('votes');

 

unsignedTinyInteger()

Các unsignedTinyIntegerphương pháp tạo ra một UNSIGNED TINYINTcột tương đương:

$table->unsignedTinyInteger('votes');

 

uuidMorphs()

Các uuidMorphsphương pháp là một phương pháp tiện lợi mà bổ sung thêm một {column}_id CHAR(36)cột tương đương và một {column}_type VARCHARcột tương đương.

Phương pháp này nhằm mục đích được sử dụng khi xác định các cột cần thiết cho mối quan hệ Eloquent đa hình sử dụng các định danh UUID. Trong ví dụ sau, taggable_idvà taggable_typecác cột sẽ được tạo:

$table->uuidMorphs('taggable');

 

uuid()

Các uuidphương pháp tạo ra một UUIDcột tương đương:

$table->uuid('id');

 

year()

Các yearphương pháp tạo ra một YEARcột tương đương:

$table->year('birth_year');

 

Công cụ sửa đổi cột

Ngoài các loại cột được liệt kê ở trên, bạn có thể sử dụng một số "công cụ sửa đổi" cột khi thêm cột vào bảng cơ sở dữ liệu. Ví dụ: để làm cho cột là "nullable", bạn có thể sử dụng nullablephương pháp:

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

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->nullable();
});

Bảng sau đây chứa tất cả các công cụ sửa đổi cột có sẵn. Danh sách này không bao gồm các công cụ sửa đổi chỉ mục :

bổ nghĩa Sự miêu tả
->after('column') Đặt cột "sau" một cột khác (MySQL).
->autoIncrement() Đặt các cột INTEGER làm tự động tăng dần (khóa chính).
->charset('utf8mb4') Chỉ định một bộ ký tự cho cột (MySQL).
->collation('utf8mb4_unicode_ci') Chỉ định đối chiếu cho cột (MySQL / PostgreSQL / SQL Server).
->comment('my comment') Thêm nhận xét vào một cột (MySQL / PostgreSQL).
->default($value) Chỉ định giá trị "mặc định" cho cột.
->first() Đặt cột "đầu tiên" trong bảng (MySQL).
->from($integer) Đặt giá trị bắt đầu của trường tự động tăng dần (MySQL / PostgreSQL).
->nullable($value = true) Cho phép các giá trị NULL được chèn vào cột.
->storedAs($expression) Tạo một cột được tạo được lưu trữ (MySQL).
->unsigned() Đặt các cột INTEGER là UNSIGNED (MySQL).
->useCurrent() Đặt cột TIMESTAMP để sử dụng CURRENT_TIMESTAMP làm giá trị mặc định.
->useCurrentOnUpdate() Đặt cột TIMESTAMP để sử dụng CURRENT_TIMESTAMP khi bản ghi được cập nhật.
->virtualAs($expression) Tạo một cột được tạo ảo (MySQL).
->generatedAs($expression) Tạo một cột nhận dạng với các tùy chọn trình tự được chỉ định (PostgreSQL).
->always() Xác định mức độ ưu tiên của các giá trị trình tự so với đầu vào cho một cột nhận dạng (PostgreSQL).

 

Biểu thức mặc định

Công cụ defaultsửa đổi chấp nhận một giá trị hoặc một Illuminate\Database\Query\Expressionthể hiện. Việc sử dụng một Expressionthể hiện sẽ ngăn Laravel bao bọc giá trị trong dấu ngoặc kép và cho phép bạn sử dụng các chức năng cụ thể của cơ sở dữ liệu. Một tình huống mà điều này đặc biệt hữu ích là khi bạn cần gán giá trị mặc định cho các cột JSON:

<?php

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

class CreateFlightsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->json('movies')->default(new Expression('(JSON_ARRAY())'));
            $table->timestamps();
        });
    }
}

 

Hỗ trợ cho các biểu thức mặc định phụ thuộc vào trình điều khiển cơ sở dữ liệu, phiên bản cơ sở dữ liệu và loại trường của bạn. Vui lòng tham khảo tài liệu cơ sở dữ liệu của bạn.

 

 

Thứ tự cột

Khi sử dụng cơ sở dữ liệu MySQL, afterphương pháp này có thể được sử dụng để thêm các cột sau một cột hiện có trong lược đồ:

$table->after('password', function ($table) {
    $table->string('address_line1');
    $table->string('address_line2');
    $table->string('city');
});

 

Sửa đổi cột

 

Điều kiện tiên quyết

Trước khi sửa đổi một cột, bạn phải cài đặt doctrine/dbalgói bằng trình quản lý gói Composer. Thư viện Doctrine DBAL được sử dụng để xác định trạng thái hiện tại của cột và tạo các truy vấn SQL cần thiết để thực hiện các thay đổi được yêu cầu đối với cột của bạn:

composer require doctrine/dbal

Nếu bạn định sửa đổi các cột được tạo bằng timestampphương pháp này, bạn cũng phải thêm cấu hình sau vào config/database.phptệp cấu hình ứng dụng của mình :

use Illuminate\Database\DBAL\TimestampType;

'dbal' => [
    'types' => [
        'timestamp' => TimestampType::class,
    ],
],

 

Nếu ứng dụng của bạn đang sử dụng Microsoft SQL Server, hãy đảm bảo rằng bạn cài đặt doctrine/dbal:^3.0.

 

 

Cập nhật thuộc tính cột

Các changephương pháp cho phép bạn sửa đổi các loại và các thuộc tính của cột hiện có. Ví dụ, bạn có thể muốn tăng kích thước của một stringcột. Để xem changephương thức đang hoạt động, hãy tăng kích thước của namecột từ 25 lên 50. Để thực hiện điều này, chúng ta chỉ cần xác định trạng thái mới của cột và sau đó gọi changephương thức:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});

Chúng tôi cũng có thể sửa đổi một cột để có thể vô hiệu:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
});

 

Các loại cột sau đây có thể được chỉnh sửa: bigIntegerbinarybooleandatedateTimedateTimeTzdecimalintegerjsonlongTextmediumTextsmallIntegerstringtexttimeunsignedBigIntegerunsignedIntegerunsignedSmallInteger, và uuid. Để sửa đổi timestampkiểu cột, bạn phải đăng ký kiểu Doctrine .

 

 

Đổi tên các cột

Để đổi tên một cột, bạn có thể sử dụng renameColumnphương pháp được cung cấp bởi kế hoạch chi tiết của trình tạo lược đồ. Trước khi đổi tên cột, hãy đảm bảo rằng bạn đã cài đặt doctrine/dbalthư viện thông qua trình quản lý gói Composer:

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

 

Đổi tên một enumcột hiện không được hỗ trợ.

 

 

Cột thả

Để bỏ một cột, bạn có thể sử dụng dropColumnphương pháp trên bản thiết kế của trình tạo lược đồ. Nếu ứng dụng của bạn đang sử dụng cơ sở dữ liệu SQLite, bạn phải cài đặt doctrine/dbalgói thông qua trình quản lý gói Composer trước khi dropColumncó thể sử dụng phương pháp:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('votes');
});

Bạn có thể bỏ nhiều cột từ một bảng bằng cách chuyển một mảng tên cột vào dropColumnphương thức:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
});

 

Loại bỏ hoặc sửa đổi nhiều cột trong một lần di chuyển trong khi sử dụng cơ sở dữ liệu SQLite không được hỗ trợ.

 

 

Bí danh Lệnh có sẵn

Laravel cung cấp một số phương pháp thuận tiện liên quan đến việc loại bỏ các loại cột phổ biến. Mỗi phương pháp này được mô tả trong bảng dưới đây:

Chỉ huy Sự miêu tả
$table->dropMorphs('morphable'); Thả cột morphable_idvà morphable_type.
$table->dropRememberToken(); Bỏ remember_tokencột.
$table->dropSoftDeletes(); Bỏ deleted_atcột.
$table->dropSoftDeletesTz(); Bí danh của dropSoftDeletes()phương pháp.
$table->dropTimestamps(); Thả cột created_atvà updated_at.
$table->dropTimestampsTz(); Bí danh của dropTimestamps()phương pháp.

 

Chỉ mục

 

Tạo chỉ mục

Trình tạo lược đồ Laravel hỗ trợ một số loại chỉ mục. Ví dụ sau tạo một emailcột mới và chỉ định rằng các giá trị của nó phải là duy nhất. Để tạo chỉ mục, chúng ta có thể xâu chuỗi uniquephương thức vào định nghĩa cột:

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

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->unique();
});

Ngoài ra, bạn có thể tạo chỉ mục sau khi xác định cột. Để làm như vậy, bạn nên gọi uniquephương thức trên bản thiết kế trình tạo lược đồ. Phương thức này chấp nhận tên của cột sẽ nhận được một chỉ mục duy nhất:

$table->unique('email');

Bạn thậm chí có thể chuyển một mảng cột đến một phương thức chỉ mục để tạo một chỉ mục phức hợp (hoặc kết hợp):

$table->index(['account_id', 'created_at']);

Khi tạo chỉ mục, Laravel sẽ tự động tạo tên chỉ mục dựa trên bảng, tên cột và kiểu chỉ mục, nhưng bạn có thể chuyển đối số thứ hai vào phương thức để tự chỉ định tên chỉ mục:

$table->unique('email', 'unique_email');

 

Các loại chỉ mục có sẵn

Lớp kế hoạch chi tiết của trình tạo lược đồ của Laravel cung cấp các phương thức để tạo từng loại chỉ mục được hỗ trợ bởi Laravel. Mỗi phương thức chỉ mục chấp nhận một đối số thứ hai tùy chọn để chỉ định tên của chỉ mục. Nếu bị bỏ qua, tên sẽ được lấy từ tên của bảng và (các) cột được sử dụng cho chỉ mục, cũng như kiểu chỉ mục. Mỗi phương pháp chỉ mục có sẵn được mô tả trong bảng dưới đây:

Chỉ huy Sự miêu tả
$table->primary('id'); Thêm khóa chính.
$table->primary(['id', 'parent_id']); Thêm các khóa tổng hợp.
$table->unique('email'); Thêm một chỉ mục duy nhất.
$table->index('state'); Thêm chỉ mục.
$table->spatialIndex('location'); Thêm chỉ mục không gian (ngoại trừ SQLite).

 

Độ dài chỉ mục & MySQL / MariaDB

Theo mặc định, Laravel sử dụng bộ utf8mb4ký tự. Nếu bạn đang chạy phiên bản MySQL cũ hơn bản phát hành 5.7.7 hoặc MariaDB cũ hơn bản phát hành 10.2.2, bạn có thể cần phải định cấu hình theo cách thủ công độ dài chuỗi mặc định được tạo bởi quá trình di chuyển để MySQL tạo chỉ mục cho chúng. Bạn có thể định cấu hình độ dài chuỗi mặc định bằng cách gọi Schema::defaultStringLengthphương thức trong bootphương thức của App\Providers\AppServiceProviderlớp bạn :

use Illuminate\Support\Facades\Schema;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191);
}

Ngoài ra, bạn có thể bật innodb_large_prefixtùy chọn cho cơ sở dữ liệu của mình. Tham khảo tài liệu của cơ sở dữ liệu của bạn để biết hướng dẫn về cách bật tùy chọn này đúng cách.

 

Đổi tên chỉ mục

Để đổi tên một chỉ mục, bạn có thể sử dụng renameIndexphương pháp được cung cấp bởi kế hoạch chi tiết của trình tạo lược đồ. Phương thức này chấp nhận tên chỉ mục hiện tại làm đối số đầu tiên và tên mong muốn làm đối số thứ hai:

$table->renameIndex('from', 'to')

 

Giảm chỉ số

Để bỏ một chỉ mục, bạn phải chỉ định tên của chỉ mục. Theo mặc định, Laravel tự động gán tên chỉ mục dựa trên tên bảng, tên của cột được lập chỉ mục và kiểu chỉ mục. Dưới đây là một số ví dụ:

Chỉ huy Sự miêu tả
$table->dropPrimary('users_id_primary'); Bỏ khóa chính khỏi bảng "người dùng".
$table->dropUnique('users_email_unique'); Bỏ một chỉ mục duy nhất từ ​​bảng "người dùng".
$table->dropIndex('geo_state_index'); Bỏ chỉ mục cơ bản khỏi bảng "địa lý".
$table->dropSpatialIndex('geo_location_spatialindex'); Thả một chỉ mục không gian từ bảng "địa lý" (ngoại trừ SQLite).

Nếu bạn chuyển một mảng cột vào một phương thức làm giảm chỉ mục, tên chỉ mục thông thường sẽ được tạo dựa trên tên bảng, cột và kiểu chỉ mục:

Schema::table('geo', function (Blueprint $table) {
    $table->dropIndex(['state']); // Drops index 'geo_state_index'
});

 

Các ràng buộc chính đối ngoại

Laravel cũng cung cấp hỗ trợ để tạo các ràng buộc khóa ngoại, được sử dụng để buộc tính toàn vẹn tham chiếu ở cấp cơ sở dữ liệu. Ví dụ: hãy xác định một user_idcột trên postsbảng tham chiếu đến idcột trên usersbảng:

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

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

Vì cú pháp này khá dài dòng, Laravel cung cấp các phương thức bổ sung, ngắn gọn hơn sử dụng các quy ước để cung cấp trải nghiệm tốt hơn cho nhà phát triển. Khi sử dụng foreignIdphương thức để tạo cột của bạn, ví dụ trên có thể được viết lại như sau:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

Các foreignIdphương pháp tạo ra một UNSIGNED BIGINTcột tương đương, trong khi constrainedphương pháp sẽ sử dụng công ước để xác định bảng và cột tên đang được tham chiếu. Nếu tên bảng của bạn không khớp với các quy ước của Laravel, bạn có thể chỉ định tên bảng bằng cách chuyển nó làm đối số cho constrainedphương thức:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained('users');
});

Bạn cũng có thể chỉ định hành động mong muốn cho các thuộc tính "khi xóa" và "khi cập nhật" của ràng buộc:

$table->foreignId('user_id')
      ->constrained()
      ->onUpdate('cascade')
      ->onDelete('cascade');

Bất kỳ công cụ sửa đổi cột bổ sung nào phải được gọi trước constrainedphương thức:

$table->foreignId('user_id')
      ->nullable()
      ->constrained();

 

Bỏ chìa khóa nước ngoài

Để dropForeignxóa khóa ngoại, bạn có thể sử dụng phương pháp, chuyển tên của ràng buộc khóa ngoại sẽ bị xóa làm đối số. Các ràng buộc khóa ngoại sử dụng quy ước đặt tên giống như các chỉ mục. Nói cách khác, tên ràng buộc khóa ngoại dựa trên tên của bảng và các cột trong ràng buộc, theo sau là hậu tố "_foreign":

$table->dropForeign('posts_user_id_foreign');

Ngoài ra, bạn có thể chuyển một mảng chứa tên cột chứa khóa ngoại vào dropForeignphương thức. Mảng sẽ được chuyển đổi thành tên ràng buộc khóa ngoại bằng cách sử dụng các quy ước đặt tên cho ràng buộc của Laravel:

$table->dropForeign(['user_id']);

 

Chuyển đổi các ràng buộc khóa nước ngoài

Bạn có thể bật hoặc tắt các ràng buộc khóa ngoại trong quá trình di chuyển của mình bằng cách sử dụng các phương pháp sau:

Schema::enableForeignKeyConstraints();

Schema::disableForeignKeyConstraints();

 

SQLite vô hiệu hóa các ràng buộc khóa ngoại theo mặc định. Khi sử dụng SQLite, hãy đảm bảo bật hỗ trợ khóa ngoại trong cấu hình cơ sở dữ liệu của bạn trước khi cố gắng tạo chúng trong quá trình di chuyển của bạn. Ngoài ra, SQLite chỉ hỗ trợ khóa ngoại khi tạo bảng và không hỗ trợ khi bảng bị thay đổi .

 

 

Sự kiện

Để thuận tiện, mỗi thao tác di chuyển sẽ gửi một sự kiện . Tất cả các sự kiện sau đều mở rộng Illuminate\Database\Events\MigrationEventlớp cơ sở :

Lớp Sự miêu tả
Illuminate\Database\Events\MigrationsStarted Một đợt di chuyển sắp được thực hiện.
Illuminate\Database\Events\MigrationsEnded Một loạt quá trình di chuyển đã hoàn tất quá trình thực thi.
Illuminate\Database\Events\MigrationStarted Một lần di chuyển sắp được thực hiện.
Illuminate\Database\Events\MigrationEnded Một lần di chuyển đã hoàn tất quá trình thực thi.
» Tiếp: Bắt đầu
« Trước: Pagination (Phân trang)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!