Penghijrahan pangkalan data
- Rollback migrasi
- Jadual data
- Buat jadual data
- Buat medan
- Pengenalan Migrasi adalah seperti kawalan versi pangkalan data, membolehkan pasukan mengedit dan berkongsi struktur jadual pangkalan data aplikasi biasanya digunakan bersama dengan struktur pangkalan data Laravel membina struktur pangkalan data dengan mudah. Jika anda pernah terpaksa meminta rakan sekerja untuk menambah medan secara manual pada struktur pangkalan data, penghijrahan pangkalan data boleh menyelamatkan anda daripada perlu berbuat demikian.
- Fasad Laravel menyediakan sokongan yang sepadan untuk mencipta dan mengendalikan jadual data untuk semua sistem pangkalan data yang disokong oleh Laravel.
Jana migrasi
Gunakan perintah Artisan make:migration
untuk membuat migrasi. make:migration
来创建迁移。
php artisan make:migration create_users_table
新的迁移位于 database/migrations
目录下。每个迁移文件名都包含时间戳,以便让 Laravel 确认迁移的顺序。
--table
和 --create
选项可用来指定数据表的名称,或是该迁移被执行时是否将创建的新数据表。这些选项需在预生成迁移文件时填入指定的数据表:
php artisan make:migration create_users_table --create=users php artisan make:migration add_votes_to_users_table --table=users
如果你想要指定生成迁移指定一个自定义输出路径,则可以在运行 make:migration
命令时添加 --path
选项,给定的路径必须是相对于应用程序的基本路径。
迁移结构
迁移类通常会包含 2 个方法: up
和 down
。 up
方法用于添加新的数据表, 字段或者索引到数据库, 而 down
方法就是 up
方法的反操作,和 up
里的操作相反。
在这 2 个方法中都要用到 Laravel 的 Schema
构建器来创建和修改表,
若要了解 Schema
生成器中的所有可用方法 ,可以查看它的文档。比如,创建 flights
表的简单示例:
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateFlightsTable extends Migration{ /** * 运行数据库迁移 * * @return void */ public function up() { Schema::create('flights', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('airline'); $table->timestamps(); }); } /** * 回滚数据库迁移 * * @return void */ public function down() { Schema::drop('flights'); } }
运行迁移
执行 Artisan 命令 migrate
来运行所有未完成的迁移:
php artisan migrate
{注意} 如果你正在使用 Homestead 虚拟机,你应该在你的虚拟机里执行这个命令。
在生产环境强制执行迁移
一些迁移操作是具有破坏性的, 这意味着可能会导致数据丢失。 为了防止有人在生产环境中运行这些命令, 系统会在这些命令被运行之前与你进行确认。如果要强制忽略系统的提示运行命令, 则可以使用 --force
标记:
php artisan migrate --force
回滚迁移
若要回滚最后一次迁移, 可以使用 rollback
命令。 此命令将回滚最后一次 “迁移” 的操作,其中可能包含多个迁移文件:
php artisan migrate:rollback
你可以在 rollback
命令后面加上 step
参数,来限制回滚迁移的个数。 例如,以下命令将回滚最近五次迁移:
php artisan migrate:rollback --step=5
migrate:reset
php artisan migrate:resetPenghijrahan baharu terletak dalam direktori
--jadual
dan --create
boleh digunakan untuk menentukan nama jadual data, atau sama ada jadual data baharu akan dibuat apabila migrasi dibuat dilaksanakan. Pilihan ini perlu diisi dalam jadual data yang ditentukan semasa pra-menjana fail migrasi: 🎜php artisan migrate:refresh // 刷新数据库结构并执行数据填充 php artisan migrate:refresh --seed🎜 Jika anda ingin menentukan laluan output tersuai untuk menjana migrasi, anda boleh menambahkannya semasa menjalankan
make:migration< /code> arahan --path
pilihan, laluan yang diberikan mestilah relatif kepada laluan asas aplikasi.
🎜
🎜🎜Struktur migrasi🎜🎜Kelas migrasi biasanya mengandungi 2 kaedah: atas
dan down
. Kaedah up
digunakan untuk menambah jadual data, medan atau indeks baharu pada pangkalan data dan kaedah down
ialah operasi terbalik bagi up
kaedah, dan up
diterbalikkan. 🎜🎜Dalam dua kaedah ini, pembina Schema
Laravel digunakan untuk mencipta dan mengubah suai jadual.Untuk memahami semua fungsi dalam penjana
Skema
Kaedah yang tersedia, boleh melihat dokumentasinya. Contohnya, contoh mudah untuk membuat jadual penerbangan
: 🎜php artisan migrate:refresh --step=5🎜🎜
migrate
untuk menjalankan semua migrasi tertunggak:🎜php artisan migrate:fresh php artisan migrate:fresh --seed
🎜{Nota} Jika anda menggunakan mesin maya Homestead, anda harus melaksanakannya dalam mesin maya arahan ini. 🎜
Penghijrahan paksa dalam persekitaran pengeluaran
🎜Sesetengah operasi migrasi merosakkan, yang bermaksud ia boleh menyebabkan Data hilang. Untuk menghalang seseorang daripada menjalankan arahan ini dalam persekitaran pengeluaran, sistem akan mengesahkan dengan anda sebelum arahan ini dijalankan. Jika anda ingin memaksa arahan dijalankan tanpa mengira gesaan sistem, anda boleh menggunakan tag--force
: 🎜Schema::create('users', function (Blueprint $table) { $table->increments('id'); });🎜🎜
Penghijrahan balik
🎜Untuk melancarkan semula migrasi terakhir, anda boleh menggunakan perintahrollback
. Perintah ini akan melancarkan operasi "penghijrahan" yang terakhir, yang mungkin mengandungi berbilang fail migrasi: 🎜if (Schema::hasTable('users')) { // } if (Schema::hasColumn('users', 'email')) { // }🎜Anda boleh menambah parameter
step
selepas perintah rollback
untuk Hadkan nombor penghijrahan balik. Sebagai contoh, arahan berikut akan melancarkan lima migrasi terakhir: 🎜Schema::connection('foo')->create('users', function (Blueprint $table) { $table->increments('id'); });🎜
migrate:reset
Perintah itu boleh melancarkan semula semua migrasi dalam aplikasi: 🎜Schema::rename($from, $to);🎜🎜
Gunakan satu arahan untuk melakukan pemulangan atau penghijrahan
Perintah migrate:refresh
bukan sahaja akan melancarkan semula semua migrasi pangkalan data tetapi juga akan menjalankan perintah migrate
selepas itu. Perintah ini boleh membina semula keseluruhan pangkalan data dengan cekap: migrate:refresh
命令不仅会回滚数据库的所有迁移还会接着运行 migrate
命令。 这个命令可以高效地重建整个数据库:
Schema::drop('users');Schema::dropIfExists('users');
使用 refresh
命令并提供 step
参数来回滚并再执行最后指定的迁移数。例如, 以下命令将回滚并重新执行最后五次迁移:
Schema::table('users', function (Blueprint $table) { $table->string('email'); });
删除所有表 & 迁移
The migrate:fresh
命令会从数据库中删除所有表,然后执行 migrate
命令:
Schema::table('users', function (Blueprint $table) { $table->string('email')->nullable(); });
数据表
创建数据表
可以使用 Schema
facade 的 create
方法来创建新的数据库表。 create
方法接受两个参数:第一个参数为数据表的名称,第二个参数是 Closure
,此闭包会接收一个用于定义新数据表的 Blueprint
对象:
composer require doctrine/dbal
当然,在创建数据表的时候,可以使用任何数据库结构生成器的 字段方法 来定义数据表的字段。
检查数据表 / 字段是否存在
可以使用 hasTable
和 hasColumn
Schema::table('users', function (Blueprint $table) { $table->string('name', 50)->change(); });Gunakan perintah
refresh
dan berikan parameter step
untuk melancarkan semula dan melaksanakan semula bilangan migrasi terakhir yang ditentukan. Sebagai contoh, arahan berikut akan melancarkan semula dan melaksanakan semula lima migrasi terakhir: Schema::table('users', function (Blueprint $table) { $table->string('name', 50)->nullable()->change(); });🎜Padam semua jadual & pindahkan 🎜🎜
migrate:fresh arahan akan memadam semua jadual daripada pangkalan data dan kemudian melaksanakan perintah migrate
: 🎜Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
🎜🎜
🎜Jadual data
🎜🎜
🎜 Mencipta jadual Data
🎜Anda boleh menggunakan kaedah buat
fasad Skema
untuk mencipta jadual pangkalan data baharu. Kaedah create
menerima dua parameter: parameter pertama ialah nama jadual data dan parameter kedua ialah Penutupan
ini akan menerima parameter untuk menentukan data baharu jadual. Objek Blueprint
: 🎜Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});
🎜Sudah tentu, semasa membuat jadual data, anda boleh menggunakan kaedah medan bagi mana-mana struktur pangkalan data penjana untuk mentakrifkannya Medan jadual data. 🎜
🎜🎜Semak sama ada jadual/medan data wujud🎜🎜Anda boleh menggunakan kaedah hasTable
dan hasColumn
untuk menyemak data Adakah jadual atau medan wujud: 🎜Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});
🎜🎜Sambungan Pangkalan Data & Pilihan Jadual
Jika anda ingin melakukan operasi struktur pada sambungan pangkalan data yang bukan sambungan lalai, anda boleh menggunakan kaedah
:
$table->string('email')->unique();
connection
方法:$table->unique('email');
你可以在数据库结构生成器上使用以下命令来定义表的选项:
命令 | 描述 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$table->engine = 'InnoDB'; | 指定表存储引擎 (MySQL)。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$table->charset = 'utf8'; | 指定数据表的默认字符集 (MySQL)。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$table->collation = 'utf8_unicode_ci'; | 指定数据表默认的排序规则 (MySQL)。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$table->temporary(); Anda boleh menggunakan arahan berikut pada penjana struktur pangkalan data Untuk menentukan pilihan jadual:Nyatakan enjin storan meja ( MySQL).
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$table->collation = 'utf8_unicode_ci'; 🎜🎜 Tentukan pengumpulan lalai jadual data (MySQL). 🎜🎜 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$table->temporary(); 🎜🎜Buat sementara Jadual (SQL Server tidak disokong). 🎜🎜🎜🎜Namakan semula/padam jadual dataUntuk menamakan semula jadual data, anda boleh menggunakan kaedah $table->index(['account_id', 'created_at']); 删除一个已存在的数据表, 可使用 $table->unique('email', 'unique_email'); 重命名带外键的数据表在重命名表之前,你应该验证表上的任何外键约束在迁移文件中都有明确的名称,而不是让 Laravel 按照约定来设置一个名称。否则,外键的约束名称将引用旧表名。 字段创建字段使用 use Illuminate\Support\Facades\Schema; /** * 引导任何应用程序服务 * * @return void */ public function boot() { Schema::defaultStringLength(191); }Untuk memadam jadual data sedia ada, anda boleh menggunakan kaedah drop atau dropIfExists : $table->renameIndex('from', 'to') Namakan semula jadual data dengan kunci asing🎜 Sebelum menamakan semula jadual, anda harus mengesahkan bahawa sebarang kekangan kunci asing pada jadual mempunyai nama eksplisit dalam fail migrasi, dan bukannya membenarkan Laravel menetapkan nama mengikut konvensyen. Jika tidak, nama kekangan kunci asing akan merujuk kepada nama jadual lama. 🎜🎜🎜🎜🎜 field🎜🎜🎜< div name="3c6c8e" data-unique="3c6c8e">🎜🎜Buat medan🎜🎜Gunakan kaedahJadual fasad Skema untuk mengemas kini jadual data sedia ada. Seperti kaedah create , kaedah table menerima dua parameter: satu ialah nama jadual data dan satu lagi ialah yang boleh digunakan untuk menambah medan ke jadual. >Blueprint penutupan contoh: 🎜Schema::table('geo', function (Blueprint $table) { $table->dropIndex(['state']); // 删除 'geo_state_index' 索引 });🎜🎜 Jenis medan yang tersediaPenjana struktur pangkalan data mengandungi pelbagai jenis medan yang boleh ditentukan semasa membina jadual: .$table->binary('data'); Bersamaan dengan BLOBSetara dengan BOOLEAN🎜🎜🎜🎜$table->dateTimeTz('created_at'); 🎜🎜is bersamaan dengan zon Masa DATETIME🎜🎜🎜🎜$table->float('amount', 8, 2); 🎜🎜 adalah bersamaan kepada ketepatan dan asas FLOAT🎜🎜$table->geometryCollection('positions'); 🎜 🎜Setara dengan GEOMETRYCOLLECTION🎜🎜🎜🎜$table->ipAddress('visitor'); 🎜🎜samaan dengan IP alamat🎜 🎜🎜🎜$table->jsonb('options'); 🎜🎜Bersamaan dengan JSONB🎜🎜🎜🎜 🎜🎜Setara dengan LINESTRING🎜🎜🎜🎜'$longtable-&xt perihalan' ); 🎜🎜 bersamaan dengan LONGTEXT🎜🎜🎜🎜$table->macAddress('device'); 🎜🎜 bersamaan dengan alamat MAC🎜🎜🎜🎜$table->mediumInteger('votes' ); 🎜🎜Setaraf dengan MEDIUMINT🎜🎜🎜🎜$table->multiLineString('positions'); 🎜Setara dengan menambah medan deleted_at nullable dengan zon waktu untuk pemadaman lembut🎜$ table- >string('name', 100); 🎜🎜 bersamaan dengan VARCHAR dengan panjang🎜🎜🎜🎜$table->text('description'); 🎜🎜 Bersamaan dengan TEKS🎜🎜🎜🎜$table->timestamps(); 🎜🎜 bersamaan dengan nullablecreated_at dan updated_at TIMESTAMP🎜🎜🎜🎜$table->timestampsTz(); 🎜🎜 adalah bersamaan dengan nullable created_at dengan zon waktu dan updated_at TIMESTAMP🎜🎜🎜🎜$table->tinyIncrements('id'); 🎜🎜 adalah bersamaan dengan auto-increment UNSIGNED TINYINT🎜🎜🎜 🎜< kod>$table->tinyInteger('votes');🎜🎜 bersamaan dengan TINYINT🎜🎜🎜🎜$table->unsignedBigInteger('votes'); 🎜 🎜bersamaan dengan BIGINT Tak Bertanda🎜🎜🎜🎜$table->unsignedMediumInteger('votes');
Pengubahsuaian medanSelain jenis medan yang disenaraikan di atas, terdapat beberapa "pengubah suai" yang boleh digunakan semasa menambah medan pada jadual pangkalan data. Sebagai contoh, jika anda ingin membuat medan "nullable", anda boleh menggunakan kaedah Schema::table('posts', function (Blueprint $table) { $table->unsignedInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); }); Berikut ialah senarai semua pengubah suai medan yang tersedia. Senarai ini tidak termasuk pengubah suai indeks : . ->autoIncrement()Tetapkan medan jenis INTEGER sebagai kunci utama auto-incrementNyatakan aksara Tetapkan (MySQL)Nyatakan penyusunan lajur (MySQL/SQL Server)
->nullable($value = true ) 🎜 🎜Medan ini membenarkan nilai NULL ditulis (secara lalai) 🎜🎜🎜🎜->useCurrent() 🎜 Medan jenis TIMESTAMP untuk menggunakan CURRENT_TIMESTAMP Sebagai lalai 🎜🎜🎜🎜Ubah suai medanPrasyaratSebelum mengubah suai medan, sila pastikan anda menambah $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); 更新字段属性
$table->dropForeign('posts_user_id_foreign'); 我们应该将字段修改为可空: $table->dropForeign(['user_id']);
重命名字段可以使用结构生成器上的 Schema::enableForeignKeyConstraints(); Schema::disableForeignKeyConstraints();
删除字段可以使用结构生成器上的 你可以传递一个字段数组给 Kemas kini sifat medan < Kaedah kod>tukar boleh mengubah suai jenis medan sedia ada kepada jenis baharu atau mengubah suai atribut.rrreee Kita harus mengubah suai medan kepada boleh dibatalkan: rrreee🎜 🎜{Nota} Hanya jenis medan berikut boleh "diubah suai": bigInteger, binari, boolean, tarikh, dateTime, dateTimeTz, perpuluhan, integer, json, longText, mediumText, smallInteger, rentetan, teks, masa , unsignedBigInteger, unsignedInteger dan unsignedSmallInteger . 🎜🎜🎜🎜Namakan semula Medan🎜🎜Medan boleh dinamakan semula menggunakan kaedah renameColumn pada pembina struktur. Sebelum menamakan semula medan, sila pastikan doctrine/dbal telah ditambahkan pada fail composer.json anda: 🎜rrreee🎜🎜{Nota} Pada masa ini, medan jenis enum adalah. tidak disokong. 🎜🎜🎜🎜🎜🎜🎜Memadam medan 🎜🎜 boleh dilakukan menggunakan dropColumn Kaedah untuk memadam medan. Sebelum memadamkan medan daripada pangkalan data SQLite, anda perlu menambah kebergantungan doctrine/dbal pada fail composer.json dan laksanakan kemas kini komposer dalam terminal untuk memasangnya. Kebergantungan ini: 🎜rrreee🎜 Anda boleh menghantar tatasusunan medan ke kaedah dropColumn untuk memadam berbilang medan: 🎜rrreee🎜🎜{Nota} Memadam atau mengubah suai berbilang medan dalam satu migrasi tidak disokong apabila menggunakan medan pangkalan data SQLite. 🎜🎜🎜🎜Alias perintah yang tersedia
| Padam | dropSoftDeletes () Alias untuk kaedah. 🎜🎜🎜🎜 | Padamupdated_at . 🎜🎜🎜🎜 | dropTimestamps () Alias untuk kaedah. 🎜🎜🎜🎜IndeksBuat IndeksPenjana Struktur menyokong pelbagai jenis indeks. Mula-mula, nyatakan bahawa nilai medan adalah unik, iaitu, hanya panggil kaedah 或者,你也可以在定义完字段之后创建索引。例如: rrreee你甚至可以将数组传递给索引方法来创建一个复合(或合成)索引: rrreeeLaravel 会自动生成一个合理的索引名称,但你也可以传递第二个参数来自定义索引名称: rrreee可用的索引类型每个索引方法都接受一个可选的第二个参数来指定索引的名称。如果省略,名称将根据表和列的名称生成。 Atau, anda juga boleh mencipta indeks selepas menentukan medan. Contohnya: Anda juga boleh menghantar tatasusunan kepada kaedah indeks untuk mencipta indeks komposit (atau sintetik): rrreee Laravel akan menjana nama indeks yang wajar secara automatik, tetapi anda juga boleh menghantar parameter kedua untuk menyesuaikan indeks name :
🎜 Jenis indeks yang tersedia🎜Setiap kaedah indeks menerima parameter kedua pilihan untuk menentukan nama indeks . Jika ditinggalkan, nama akan dijana berdasarkan nama jadual dan lajur. 🎜🎜
|