Laravel: Di chuyển dữ liệu (Migrations)
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/migrations
thư 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 --path
tùy chọn này khi thực hiện make:migration
lệ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.
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/migrations
thư 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:dump
lệ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: up
và down
. Các up
phươ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 down
phương pháp nên đảo ngược các hoạt động được thực hiện bởi các up
phươ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 Schema
, hãy xem tài liệu của nó . Ví dụ: quá trình di chuyển sau sẽ tạo ra một flights
bả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:migration
lệ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 $connection
tí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 migrate
lệ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:status
lệ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 --force
cờ:
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 rollback
lệ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 step
tùy chọn cho rollback
lệ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:reset
lệ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:refresh
lệ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 migrate
lệ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 step
tùy chọn cho refresh
lệ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:fresh
lệnh sẽ thả tất cả các bảng từ cơ sở dữ liệu và sau đó thực hiện migrate
lệnh:
php artisan migrate:fresh
php artisan migrate:fresh --seed
Các
migrate:fresh
lệ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 create
phương thức trên Schema
mặt tiền. Các create
phươ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 hasTable
và hasColumn
cá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 connection
phươ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 engine
bấ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 charset
và collation
có 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 temporary
phươ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 table
phương pháp trên Schema
mặt tiền có thể được sử dụng để cập nhật các bảng hiện có. Giống như create
phương thức, table
phươ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 Blueprint
phiê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 rename
phươ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 drop
hoặc dropIfExists
cá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 table
phương pháp trên Schema
mặt tiền có thể được sử dụng để cập nhật các bảng hiện có. Giống như create
phương thức, table
phươ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\Blueprint
thể 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:
bigIncrementsbigIntegernhị phânbooleanchardateTimeTzngày giờngàysố thập phânképenumtrôi nổinước ngoàiForeignIdFornước ngoàihình họchình họcTôigia sốsố nguyênđịa chỉ IPjsonjsonblineStringVăn bản dàiđịa chỉ MACmediumIncrementsmediumIntegermediumTexthình tháimultiLineStringmultiPointmultiPolygonnullableMorphsnullableTimestampsnullableUuidMorphschỉ trỏđa giácRememberTokenbộsmallIncrementssmallIntegersoftDeletesTzsoftDeletesdâychữtimeTzthời giandấu thời gianTzdấu thời giandấu thời gianTzdấu thời giantinyIncrementstinyIntegertinyTextunsignedBigIntegerunsignedDecimalunsignedIntegerunsignedMediumIntegerunsignedSmallIntegerunsignedTinyIntegeruuidMorphsuuidnăm
bigIncrements()
Các bigIncrements
phương pháp tạo ra một auto-incrementing UNSIGNED BIGINT
cột tương đương (khóa chính):
$table->bigIncrements('id');
bigInteger()
Các bigInteger
phương pháp tạo ra một BIGINT
cột tương đương:
$table->bigInteger('votes');
binary()
Các binary
phương pháp tạo ra một BLOB
cột tương đương:
$table->binary('photo');
boolean()
Các boolean
phương pháp tạo ra một BOOLEAN
cột tương đương:
$table->boolean('confirmed');
char()
Các char
phương pháp tạo ra một CHAR
cột tương đương với một chiều dài nhất định:
$table->char('name', 100);
dateTimeTz()
Các dateTimeTz
phươ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 dateTime
phương pháp tạo ra một DATETIME
cộ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 date
phương pháp tạo ra một DATE
cột tương đương:
$table->date('created_at');
decimal()
Các decimal
phương pháp tạo ra một DECIMAL
cộ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 double
phương pháp tạo ra một DOUBLE
cộ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 enum
phương pháp tạo ra một ENUM
cột tương đương với giá trị hợp lệ cho:
$table->enum('difficulty', ['easy', 'hard']);
float()
Các float
phương pháp tạo ra một FLOAT
cộ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 foreignId
phương pháp tạo ra một UNSIGNED BIGINT
cột tương đương:
$table->foreignId('user_id');
foreignIdFor()
Các foreignIdFor
phương pháp bổ sung thêm một {column}_id UNSIGNED BIG INT
cột tương đương với một model class đưa ra:
$table->foreignIdFor(User::class);
foreignUuid()
Các foreignUuid
phương pháp tạo ra một UUID
cột tương đương:
$table->foreignUuid('user_id');
geometryCollection()
Các geometryCollection
phương pháp tạo ra một GEOMETRYCOLLECTION
cột tương đương:
$table->geometryCollection('positions');
geometry()
Các geometry
phương pháp tạo ra một GEOMETRY
cột tương đương:
$table->geometry('positions');
id()
Các id
phương pháp là một bí danh của bigIncrements
phương pháp. Theo mặc định, phương thức sẽ tạo một id
cộ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 increments
phương pháp tạo ra một auto-incrementing UNSIGNED INTEGER
cột tương đương như một khóa chính:
$table->increments('id');
integer()
Các integer
phương pháp tạo ra một INTEGER
cột tương đương:
$table->integer('votes');
ipAddress()
Các ipAddress
phương pháp tạo ra một VARCHAR
cột tương đương:
$table->ipAddress('visitor');
json()
Các json
phương pháp tạo ra một JSON
cột tương đương:
$table->json('options');
jsonb()
Các jsonb
phương pháp tạo ra một JSONB
cột tương đương:
$table->jsonb('options');
lineString()
Các lineString
phương pháp tạo ra một LINESTRING
cột tương đương:
$table->lineString('positions');
longText()
Các longText
phương pháp tạo ra một LONGTEXT
cột tương đương:
$table->longText('description');
macAddress()
Các macAddress
phươ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 mediumIncrements
phương pháp tạo ra một auto-incrementing UNSIGNED MEDIUMINT
cột tương đương như một khóa chính:
$table->mediumIncrements('id');
mediumInteger()
Các mediumInteger
phương pháp tạo ra một MEDIUMINT
cột tương đương:
$table->mediumInteger('votes');
mediumText()
Các mediumText
phương pháp tạo ra một MEDIUMTEXT
cột tương đương:
$table->mediumText('description');
morphs()
Các morphs
phương pháp là một phương pháp tiện lợi mà bổ sung thêm một {column}_id
UNSIGNED BIGINT
cột tương đương và một {column}_type
VARCHAR
cộ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_id
và taggable_type
các cột sẽ được tạo:
$table->morphs('taggable');
multiLineString()
Các multiLineString
phương pháp tạo ra một MULTILINESTRING
cột tương đương:
$table->multiLineString('positions');
multiPoint()
Các multiPoint
phương pháp tạo ra một MULTIPOINT
cột tương đương:
$table->multiPoint('positions');
multiPolygon()
Các multiPolygon
phương pháp tạo ra một MULTIPOLYGON
cột tương đương:
$table->multiPolygon('positions');
nullableTimestamps()
Các nullableTimestamps
phươ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 point
phương pháp tạo ra một POINT
cột tương đương:
$table->point('position');
polygon()
Các polygon
phương pháp tạo ra một POLYGON
cột tương đương:
$table->polygon('position');
rememberToken()
Các rememberToken
phươ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 set
phương pháp tạo ra một SET
cộ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 smallIncrements
phương pháp tạo ra một auto-incrementing UNSIGNED SMALLINT
cột tương đương như một khóa chính:
$table->smallIncrements('id');
smallInteger()
Các smallInteger
phương pháp tạo ra một SMALLINT
cột tương đương:
$table->smallInteger('votes');
softDeletesTz()
Các softDeletesTz
phươ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_at
dấ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 softDeletes
phương pháp bổ sung thêm một nullable deleted_at
TIMESTAMP
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_at
dấ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 string
phương pháp tạo ra một VARCHAR
cột tương đương với độ dài nhất định:
$table->string('name', 100);
text()
Các text
phương pháp tạo ra một TEXT
cột tương đương:
$table->text('description');
timeTz()
Các timeTz
phươ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 time
phương pháp tạo ra một TIME
cộ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 timestampTz
phươ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 timestamp
phương pháp tạo ra một TIMESTAMP
cộ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 timestampsTz
phương pháp tạo ra created_at
và 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 timestamps
phương pháp tạo ra created_at
và updated_at
TIMESTAMP
cộ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 tinyIncrements
phương pháp tạo ra một auto-incrementing UNSIGNED TINYINT
cột tương đương như một khóa chính:
$table->tinyIncrements('id');
tinyInteger()
Các tinyInteger
phương pháp tạo ra một TINYINT
cột tương đương:
$table->tinyInteger('votes');
tinyText()
Các tinyText
phương pháp tạo ra một TINYTEXT
cột tương đương:
$table->tinyText('notes');
unsignedBigInteger()
Các unsignedBigInteger
phương pháp tạo ra một UNSIGNED BIGINT
cột tương đương:
$table->unsignedBigInteger('votes');
unsignedDecimal()
Các unsignedDecimal
phương pháp tạo ra một UNSIGNED DECIMAL
cộ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 unsignedInteger
phương pháp tạo ra một UNSIGNED INTEGER
cột tương đương:
$table->unsignedInteger('votes');
unsignedMediumInteger()
Các unsignedMediumInteger
phương pháp tạo ra một UNSIGNED MEDIUMINT
cột tương đương:
$table->unsignedMediumInteger('votes');
unsignedSmallInteger()
Các unsignedSmallInteger
phương pháp tạo ra một UNSIGNED SMALLINT
cột tương đương:
$table->unsignedSmallInteger('votes');
unsignedTinyInteger()
Các unsignedTinyInteger
phương pháp tạo ra một UNSIGNED TINYINT
cột tương đương:
$table->unsignedTinyInteger('votes');
uuidMorphs()
Các uuidMorphs
phươ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
VARCHAR
cộ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_id
và taggable_type
các cột sẽ được tạo:
$table->uuidMorphs('taggable');
uuid()
Các uuid
phương pháp tạo ra một UUID
cột tương đương:
$table->uuid('id');
year()
Các year
phương pháp tạo ra một YEAR
cộ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 nullable
phươ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ụ default
sửa đổi chấp nhận một giá trị hoặc một Illuminate\Database\Query\Expression
thể hiện. Việc sử dụng một Expression
thể 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, after
phươ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/dbal
gó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 timestamp
phương pháp này, bạn cũng phải thêm cấu hình sau vào config/database.php
tệ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 change
phươ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 string
cột. Để xem change
phương thức đang hoạt động, hãy tăng kích thước của name
cộ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 change
phươ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:
bigInteger
,binary
,boolean
,date
,dateTime
,dateTimeTz
,decimal
,integer
,json
,longText
,mediumText
,smallInteger
,string
,text
,time
,unsignedBigInteger
,unsignedInteger
,unsignedSmallInteger
, vàuuid
. Để sửa đổitimestamp
kiể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 renameColumn
phươ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/dbal
thư 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
enum
cột hiện không được hỗ trợ.
Cột thả
Để bỏ một cột, bạn có thể sử dụng dropColumn
phươ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/dbal
gói thông qua trình quản lý gói Composer trước khi dropColumn
có 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 dropColumn
phươ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_id và morphable_type . |
$table->dropRememberToken(); |
Bỏ remember_token cột. |
$table->dropSoftDeletes(); |
Bỏ deleted_at cột. |
$table->dropSoftDeletesTz(); |
Bí danh của dropSoftDeletes() phương pháp. |
$table->dropTimestamps(); |
Thả cột created_at và 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 email
cộ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 unique
phươ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 unique
phươ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ộ utf8mb4
ký 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::defaultStringLength
phương thức trong boot
phương thức của App\Providers\AppServiceProvider
lớ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_prefix
tù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 renameIndex
phươ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_id
cột trên posts
bảng tham chiếu đến id
cột trên users
bả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 foreignId
phươ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 foreignId
phương pháp tạo ra một UNSIGNED BIGINT
cột tương đương, trong khi constrained
phươ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 constrained
phươ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 constrained
phương thức:
$table->foreignId('user_id')
->nullable()
->constrained();
Bỏ chìa khóa nước ngoài
Để dropForeign
xó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 dropForeign
phươ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\MigrationEvent
lớ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. |