Tạo bảng và khoá ngoại trong database Migration:

Một phần của tài liệu Xây dựng Website bán mỹ phẩm trực tuyến sử dụng Framework Laravel. (Trang 50 - 58)

trong Laravel có nghĩa là “sự ánh xạ” hay “sự di trú”.

Igration là các class PHP được dùng để mô tả các loại đối tượng, quy định kiểu dữ liệu của các thuộc tính và quan hệ giữa các đối tượng. Khi thực hiện migrate (ánh xạ) thì Laravel sẽ chạy các migration và tác động vào database để tạo ra các bảng dữ liệu, các ràng buộc về khoá chính, khoá ngoại, v.v… một cách hoàn hảo.

Điều này có nghĩa là dev không cần phải nhớ thêm một ngôn ngữ SQL hay no-SQL nào nữa. Laravel tự chuyển đổi giữa các HQT CSDL, đem lại lợi

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 40

thế cực kỳ to lớn khi muốn chuyển đổi sử dụng HQT CSDL khác nhau. Ví dụ ban đầu dùng MySQL, sau đó có nhiều tiền từ các nhà đầu tư, nhu cầu về database lớn lên đổi qua Oracle... Tất cả trở nên đơn giản với Migration. Đó là chuyện lớn, chuyện thường ngày xẩy ra với team lập trình là khi mỗi người phát triền một phần chức năng, tự xây các bảng dữ liệu khác nhau, làm thế nào đồng bộ cấu trúc bảng giữa tất cả mọi người trong team. Không thể nào cứ mỗi lần có 1 người cập nhật DB thì lại phải export, import DB. Với migration, chỉ cần commitpush code. Ai cần dùng thì update code mới và chạy lệnh migrate là xong. Việc đồng bộ cấu trúc cơ sở dữ liệu quá đơn giản.

Tạo ánh xạ của bảng: Để tạo bản ánh xạ mới, dùng lệnh make:migration

của Artisan.

$ php artisan make:migration create_users_table.

Một file ánh xạ mới sẽ xuất hiện trong thư mục database/migrations. Mỗi file migration có phần timestamp trong tên file để Laravel xác định thứ tự thực thi các migration. Nên chú ý thứ tự này để tạo cho đúng. Ví dụ tạo migration của bảng Category trước khi tạo migration của Post. Cấu trúc file ánh xạ: Một file ánh xạ là một class PHP kết thừa từ class Migration của Laravel. Có hai hàm cần chú ý ở trong file này là updown. Trong đó up là các thao tác trên DB khi tạo, khi migrate. Còn down là các thao tác trên db khi xoá, khi rollback. Xem mẫu sau:

<?php

use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateFlightsTable extends Migration{ /**

* Run the migrations. *

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 41

* @return void */

public function up() {

// Các thao tác tác động tạo bảng ở đây

Schema::create('flights', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('airline'); $table->timestamps(); }); } /**

* Reverse the migrations. *

* @return void */

public function down() {

//Khi cần rollback, ứng dụng sẽ gọi hàm down, xoá bảng và relation ở đây

Schema::drop('flights'); }

}

Viết ánh xạ: Sau khi chạy Artisan sẽ tạo được migration giống mẫu ở trên, bây giờ cần định nghĩa các đối tượng dữ liệu. Tạo bảng: Để tạo bảng mới trong DB, sử dụng hàm create của Schema

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 42

facade. Hàm create nhận hai tham số, đầu tiên là tên bảng, thứ hai là một hàm Closure trong đó sẽ định nghĩa cấu trúc bảng.

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

// Các định nghĩa cột khác });

Tất nhiên, khi tạo bảng thì cần tạo cột nữa, chúng ta sẽ học tiếp về cách định nghĩa cột ngay bên dưới đây.

Kiểm tra bảng/cột tồn tại: Bạn có thể dễ dàng kiểm tra được một bảng/cột có tồn tại hay không trước khi cần tạo/xoá bảng hay cột:

if (Schema::hasTable('users')) { // } if (Schema::hasColumn('users', 'email')) { // } Chọn kết nối và engine lưu trữ: Nếu ứng dụng của bạn có nhiều kết nối DB khác nhau, bạn có thể chọn kết nối bằng hàm connection:

chema::connection('foo')->create('users', function ($table) { $table->increments('id');

});

Để cài đặt storage engine cho một bảng, gán tên vào thuộc tính engin của bảng:

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

$table->increments('id'); });

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 43

Với MySQL có hai engine chính hay dùng là MyISAMInnoDB. Tạo cột: Để tạo cột, có thể dùng biến $table trong tham số thứ hai:

<span class="token scope">Schema<span class="token

punctuation">::</span></span><span class="token function">table<span class="token punctuation">(</span></span><span class="token

string">'users'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token

punctuation">(</span><span class="token variable">$table</span><span class="token punctuation">)</span> <span class="token

punctuation">{</span>

<span class="token variable">$table</span><span class="token

operator">-</span><span class="token operator">&gt;</span><span class="token function">string<span class="token

punctuation">(</span></span><span class="token

string">'email'</span><span class="token punctuation">)</span><span class="token punctuation">; //&lt;- đây là một định nghĩa cột</span> <span class="token punctuation">}</span><span class="token

punctuation">)</span><span class="token punctuation">;</span>

$table có nhiều hàm để định nghĩa cột, mà tên hàm tương ứng với các kiểu dữ liệu của cột.

Tạo index: Index là việc sắp xếp các dòng dữ liệu trong bảng theo một chỉ mục, chỉ mục này được xác định bằng cách chỉnh định sắp xếp dựa vào cột nào, ví dụ:

$table->string('email')->unique();

Hoặc tạo index trên một cột sau khi đã tạo:

$table->unique('email');

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 44

<span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">index<span class="token

punctuation">(</span></span><span class="token punctuation">[</span><span class="token

string">'account_id'</span><span class="token punctuation">,</span> <span class="token string">'created_at'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

Việc tạo index hợp lý giúp tăng tốc thao tác đọc DB rất nhiều, nhưng sẽ giảm tốc độ ghi. Do đó, nếu bảng có nhiều thao tác ghi/update dữ liệu hơn thì không nên đặt index.

Các kiểu index:

Lệnh Mô tả

$table->primary('id'); Thêm khoá chính.

$table->primary(['cột1', 'cột2']); Khoá chính tổ hợp bởi các cột.

$table->unique('tên_cột'); Thêm một index bằng ràng buộc unique $table->unique('tên_cột', 'tên_index'); Thêm index bằng tên tuỳ chọn

$table->index('tên_cột'); Thêm index cơ bản

Bảng 1.1: Các kiểu Index

Xoá index: Để xoá index, gọi các lệnh có chữ drop ở trước tên lệnh tạo,

Ví dụ:

Schema::table('geo', function ($table) {

$table->dropIndex(['state']); // Drops index 'geo_state_index' $table->dropUnique('users_email_unique');

$table->dropPrimary('users_id_primary'); });

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 45

Khoá ngoại: Laravel hỗ trợ tạo khoá ngoại, là ràng buộc logic để chỉ sử liên quan giữa các bảng dữ liệu. Ví dụ, cần tạo khoá ngoại “người tạo” cho bảng post, chỉ cần định nghĩa cột user_id trên bảng post, cái sẽ giữ id của của user tạo ra bài viết:

Schema::table('posts', function ($table) { $table->integer('user_id')->unsigned();

$table->foreign('user_id')->references('id')->on('users'); // <- Dòng tạo khoá ngoại->

});

Cũng có thể quyết định hành vi khi xoá hay cập nhật dữ liệu đã có liên kết:

$table->foreign('user_id')

->references('id')->on('users') ->onDelete('cascade');

Để xoá khoá ngoại, dùng hàm dropForeign, tham số là tên khoá ngoại theo dạng “tên_bảng_tên_cột_foreign”.

$table->dropForeign('posts_user_id_foreign');

Hoặc đưa vào mảng tên cột dùng làm khoá ngoại, tên khoá cũng sẽ tự động được sinh ra phù hợp:

$table->dropForeign('posts_user_id_foreign'); Xoá bảng: Để xoá bảng, đơn giản là:

Schema::drop('post'); Schema::drop('users');

// Hoặc kiểm tra và xoá nếu có tồn tại Schema::dropIfExists('users');

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 46

Tạo database: Để chạy tất cả các migration, dùng lệnh migrate của Artisan:

$ php artisan migrate

Đôi khi sẽ gặp lỗi báo “class not found” thì cần phải chạy composer dump-autoload chạy lại migrate là được.

Khi chạy migrate trên môi trường ứng dụng thật, để an toàn cho dữ liệu, laravel sẽ hỏi bạn có chắc chắn muốn thực hiện, để chạy migrate mà ko bị hỏi:

$ php artisan migrate –force

Cần chú ý backup data khi chạy trên môi trường thật, tránh sơ suất làm mất DB.

Chạy lại migration khi thay đổi cấu trúc bảng. Trong quá trình phát triển, cấu trúc một bảng không cố định, có thể thêm/bớt cột, tách/gộp bảng, để nhanh chóng cập nhật thay đổi lên DB, sử dụng lệnh migrate:refresh từ

Artisan:

php artisan migrate:refresh

php artisan migrate:refresh –seed

Khi gắn thêm cờ “–seed” và dòng lệnh, sau khi cập nhật cấu trúc DB, sẽ chạy lệnh db:seed để tiến hành chèn dữ liệu mẫu vào DB.

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 47

CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG

Một phần của tài liệu Xây dựng Website bán mỹ phẩm trực tuyến sử dụng Framework Laravel. (Trang 50 - 58)

Tải bản đầy đủ (PDF)

(102 trang)