Laravel, Laravel cơ bản

[Laravel][Bài 6] làm việc với database, migration và seeding trong Laravel

Làm việc với migration trong Laravel

Nhưng ở bài số 2 mình đã giới thiệu về các tính năng chính của laravel trong đó có một tính năng rất quan trọng đó là migration. Với migration chúng ta có thể tương tác với cấu trúc của database một cách dễ dàng nhưng tạo bảng, xoá bảng, thêm cột, xoá cột, sửa tên cột, thay đổi kiểu dữ liệu…bằng các định nghĩa các file migration bằng code rồi sau đó thực thi thì hệ thống sẽ tự động tạo ra các cấu trúc CSDL cho các bạn. Chắc một số bạn sẽ thắc mắc rằng nếu muốn tạo bảng hay thêm cột.. thì chúng ta có thể vào thẳng CSDL rồi tạo trực tiếp cho nhanh, tại sao phải thông qua migration rườm rà vậy. Việc đó chỉ có thể nhanh và đơn giản khi các bạn làm một mình, hãy nghĩ tới trường hợp chúng ta làm việc với một team 10 người hoặc thâm chí là 20 người thì việc tạo CSDL như vậy sẽ là một cực hình và sẽ gây mất thời gian cho cả team, nếu có môt ai đó thay đổi cấu trúc CSDL thì họ phải đi gửi bản cập nhật cho tất cả người người khác. Migration sẽ giải quyết được vấn đề đó, hơn nữa khi làm việc với migration chúng ta có thể quản lý được version của quản lý nó một cách dễ dàng.

Trong bài viết này chúng ta hãy cùng tạo 1 cấu trúc database như đã phân tích ở bài 4 .

Chúng ta sẽ thực hiện cho bảng breeds.

Bước 1 tạo file migration.

Để tạo file migration chúng ta sẽ thực hiện câu lện sau trong command line.

Mình sẽ giải thích để các bạn dễ hiểu hơn về câu lệnh trên nhé.

php artisan migrate : đây là cú pháp bắt buộc để thông báo cho app chúng ta sẽ tạo một file migration

create_breeds_table: đây là tên file migration mà chúng ta cần tạo, tên của file này chúng ta có thể đặt bất kì chứ ko nhất thiết phải theo quy tắc nào cả, nhưng mình khuyên khích mọi người đặt tên file cho chuẩn nghĩa, nhìn vào tên file là chúng ta có thể hiểu được nội dụng file đó làm gì, tránh đặt các tên vô nghĩa như create_table, abc, xyz..

–table=breeds: đây làm một tham số optional (có cũng được, không có cũng được) nếu có thêm tham số này thì trong file migration của các bạn vừa tạo sẽ có sắn cấu trúc tạo bảng chúng ta chỉ cần viết code để tạo thêm các cột, nếu không thì chúng ta vẫn có thể viết cấu trúc tạo bảng cho file rồi sau đó thêm cột vào.

sau khi thực thi dòng lệnh đó xong các bạn vào đường dẫn database/migrations sẽ thấy một file migration vừa được tạo ra và chúng ta sẽ đi định nghĩa cấu trúc database cho bảng breeds trong file này.

1 file migration sẽ có 2 function đó là up và down, khi các bạn thực thi một file migration thì nó sẽ thực thi hàm up, và khi các bạn reset hoặc rollback thì nó sẽ thực thi hàm down vì vậy ý nghĩa hàm up và down nó sẽ ngược  nhau, nếu hàm up tạo table thì hàm down xoá table, hàm up thêm cột thì hàm down xoá cột ..

Các cột chúng ta sẽ định nghĩa ở trong nội dung hàm create, như file trên thì chúng ta đã định nghĩa bảng breeds gồm 2 cột, id ( kiểu integer và tự động tăn), name (kiểu varchar).

và cuối cùng hàm down sẽ làm hàm xoá bảng vừa mới tạo. Các cột và kiểu dữ liệu được quy định như sau:

Command Description
$table->bigIncrements('id'); Auto-incrementing UNSIGNED BIGINT (primary key) equivalent column.
$table->bigInteger('votes'); BIGINT equivalent column.
$table->binary('data'); BLOB equivalent column.
$table->boolean('confirmed'); BOOLEAN equivalent column.
$table->char('name', 100); CHAR equivalent column with an optional length.
$table->date('created_at'); DATE equivalent column.
$table->dateTime('created_at'); DATETIME equivalent column.
$table->dateTimeTz('created_at'); DATETIME (with timezone) equivalent column.
$table->decimal('amount', 8, 2); DECIMAL equivalent column with a precision (total digits) and scale (decimal digits).
$table->double('amount', 8, 2); DOUBLE equivalent column with a precision (total digits) and scale (decimal digits).
$table->enum('level', ['easy', 'hard']); ENUM equivalent column.
$table->float('amount', 8, 2); FLOAT equivalent column with a precision (total digits) and scale (decimal digits).
$table->geometry('positions'); GEOMETRY equivalent column.
$table->geometryCollection('positions'); GEOMETRYCOLLECTION equivalent column.
$table->increments('id'); Auto-incrementing UNSIGNED INTEGER (primary key) equivalent column.
$table->integer('votes'); INTEGER equivalent column.
$table->ipAddress('visitor'); IP address equivalent column.
$table->json('options'); JSON equivalent column.
$table->jsonb('options'); JSONB equivalent column.
$table->lineString('positions'); LINESTRING equivalent column.
$table->longText('description'); LONGTEXT equivalent column.
$table->macAddress('device'); MAC address equivalent column.
$table->mediumIncrements('id'); Auto-incrementing UNSIGNED MEDIUMINT (primary key) equivalent column.
$table->mediumInteger('votes'); MEDIUMINT equivalent column.
$table->mediumText('description'); MEDIUMTEXT equivalent column.
$table->morphs('taggable'); Adds taggable_id UNSIGNED INTEGER and taggable_type VARCHAR equivalent columns.
$table->multiLineString('positions'); MULTILINESTRING equivalent column.
$table->multiPoint('positions'); MULTIPOINT equivalent column.
$table->multiPolygon('positions'); MULTIPOLYGON equivalent column.
$table->nullableMorphs('taggable'); Adds nullable versions of morphs() columns.
$table->nullableTimestamps(); Alias of timestamps() method.
$table->point('position'); POINT equivalent column.
$table->polygon('positions'); POLYGON equivalent column.
$table->rememberToken(); Adds a nullable remember_token VARCHAR(100) equivalent column.
$table->smallIncrements('id'); Auto-incrementing UNSIGNED SMALLINT (primary key) equivalent column.
$table->smallInteger('votes'); SMALLINT equivalent column.
$table->softDeletes(); Adds a nullable deleted_at TIMESTAMP equivalent column for soft deletes.
$table->softDeletesTz(); Adds a nullable deleted_at TIMESTAMP (with timezone) equivalent column for soft deletes.
$table->string('name', 100); VARCHAR equivalent column with a optional length.
$table->text('description'); TEXT equivalent column.
$table->time('sunrise'); TIME equivalent column.
$table->timeTz('sunrise'); TIME (with timezone) equivalent column.
$table->timestamp('added_on'); TIMESTAMP equivalent column.
$table->timestampTz('added_on'); TIMESTAMP (with timezone) equivalent column.
$table->timestamps(); Adds nullable created_at and updated_atTIMESTAMP equivalent columns.
$table->timestampsTz(); Adds nullable created_at and updated_atTIMESTAMP (with timezone) equivalent columns.
$table->tinyIncrements('id'); Auto-incrementing UNSIGNED TINYINT (primary key) equivalent column.
$table->tinyInteger('votes'); TINYINT equivalent column.
$table->unsignedBigInteger('votes'); UNSIGNED BIGINT equivalent column.
$table->unsignedDecimal('amount', 8, 2); UNSIGNED DECIMAL equivalent column with a precision (total digits) and scale (decimal digits).
$table->unsignedInteger('votes'); UNSIGNED INTEGER equivalent column.
$table->unsignedMediumInteger('votes'); UNSIGNED MEDIUMINT equivalent column.
$table->unsignedSmallInteger('votes'); UNSIGNED SMALLINT equivalent column.
$table->unsignedTinyInteger('votes'); UNSIGNED TINYINT equivalent column.
$table->uuid('id'); UUID equivalent column.
$table->year('birth_year'); YEAR equivalent column.

Tương tự các bước giống như bảng breeds chúng ta sẽ tạo thêm 1 file migration để định nghĩa cấu trúc cho bảng cats

php artisan make:migration create_cats_table --create=cats

Trong bảng cats có field breed_id là khoá ngoại tham chiếu đến bảng breeds nên chúng ta cần định nghĩa ràng buộc về khoá ngoại cho nó như sau: $table->foreign(‘breed_id’)->references(‘id’)->on(‘breeds’);

Bước 2: Config kết nối cơ sở dữ liệu.

Laravel cho phép chúng ta làm việc với rất nhiều loại cơ sở dữ liệu khác nhau như MySQL, PostgreSQL, SQLite, SQL Server. Ở đây mình hướng dẫn mọi người làm việc với một loại cơ sở dữ liệu rất phổ biến đó là MySQL.

Để khai báo kết nối với CSDL chúng ta cần tạo 1 file .env nội dung file này các bạn cứ copy nguyên file .env.example sau đó mình sẽ thay đổi thông số database như sau.

DB_CONNECTION: là loại cơ sở dữ liệu ( ở đây là MySQL)

DB_HOST: là địa chỉ kết nối csdl ( ở đây là localhost, các bạn có thể sửa lại thành localhost vẫn được)

DB_DATABASE: là tên database trong csdl ( ở đây là wechiase-laravel)

DB_USERNAME và DB_PASSWORD : là user name và password kết nối csdl ( hiện tại máy mình là root/root một số máy có thể là root và ”)

Lưy ý:  Nếu bạn đang dùng phiên bản Mysql thấp hơn 5.7.7 thì các bạn cần thêm dòng này vào Class : /app/Providers/AppServiceProvider.php tại function boot()

 

sau khi đã định nghĩa xong 2 file migration và config thông số kết nối CSDL các bạn vào Command line và chạy lệnh

sau khi chạy thành công vào trong CSDL các bạn sẽ thấy các table đã được tạo giống như cấu trúc các bạn vừa định nghĩa. Thật tuyệt vời phải không nào.

Các bạn sẽ có thắc mắc nếu chạy lệnh migrate một lần nữa thì nó có hiện tượng gì xảy ra không nhỉ, vì các bảng breeds và cats đã được tạo rồi giờ chạy lại 1 lần nữa thì nó sẽ bị trùng tên thì sẽ sinh ra lỗi đúng không nhỉ, đừng lo lắng nhé Laravel xử lí vấn đề này rất tốt, nếu file migration nào được thực thi rồi thì khi chạy lại nó sẽ bỏ qua file đó vào không thực thi nữa. Cơ chế quản lý vấn đề này đó là Laravel sẽ tự động tạo ra 1 bảng có tên là migration trong CSDL của chúng ta, khi bất kì file migration nào được thực thi thì nó sẽ lưu tên file đó vào bảng migration và khi thực thi một file bất kì nào đó thì hệ thống sẽ check nếu tên file đó chưa đó trong bảng migration thì mới thực thi còn không nó sẽ bỏ qua. Bay giờ các bạn vào lại CSDL của các bạn để kiểm tra thử nhé, ngoài các bảng được định nghĩa nó sẽ có bảng migration chứa các tên file migration chúng ta vừa tạo.

Ngoài ra một số cú pháp về thêm cột, xoá cột, sửa cột các bạn có thể tham khảo tại trang chủ laravel.com nhé.

Làm việc với Seeding trong Laravel.

Seeding là cột công cụ giúp chúng ta tạo dự liệu cho database mà không cần phải tạo thủ công, công cụ này rất hữu ích khi các bạn muốn tạo dữ liệu demo với số lượng lớn cho trang web của mình. Để tạo seeding chúng ta thực hiện các bước sau:

Bước 1 tạo Class Seeding.

như cú pháp trên mình sẽ tạo ra được một class BreedsTableSeeder và chúng ta sẽ định nghĩa sedding trong file này. Sau khi thực thi xong các bạn vào đường dẫn database/seeds/ và sẽ thầy file BreedsTableSeeder.php được tạo và chúng ta sẽ định nghĩa seeding trong hàm run()

Bước 2: Định nghĩa nội dung trong hàm run()

 

 

Như file trên mình sẽ thêm 4 record vào bảng breeds.

Bước 3: Thực thi seeding.

Để thực thi class vừa mới tạo các bạn chạy lệnh.

Hoặc khai báo class  vừa mới tạo trong file DatabaseSeeder trong hàm Run nằm cùng cấp với class mới tạo.

Class DatabaseSeeder là nơi để chúng ta khai báo các seeder của hệ thống, nếu có nhiều seeder và muốn thực thi chúng cùng một lúc thì chúng ta chỉ cần khai báo vào hàm Run và hệ thống sẽ thực thi từ trên xuống dưới.

Sau đó thực thi lệnh.

Bây giờ các bạn vào lại CSDL kiểm tra bảng breeds sẽ thấy 4 record được tạo.

Như vậy mình đã giới thiệu cho các bạn biết về cơ bản 2 tính năng rất quang trong của laravel, ban đầu có lẻ các bạn sẽ thấy nó phức tạp và rườm rà nhưng khi các bạn làm quen được với nó sẽ thấy cái hay của nó, đặt biệt là khi các bạn phát triển dự án lớn và nhiều người tham gia.

Các bạn có thể tham khảo source code tại đây: https://github.com/wechiase/laravel/tree/c2255558321f4fc7b718c9c17a412dd398f06552

Cảm ơn các bạn đã theo dõi bài viết nhé, hẹn gặp lại các bạn ở bài viết tiếp theo.

Spread the love

Leave a Reply

Your email address will not be published. Required fields are marked *