học laravel 5

Bài 6 : Migrations trong Laravel 5

Trong bài viết này mình sẽ giới thiệu đến các bạn về migrations trong Laravel 5. Đây là một tính năng rất hay và đóng vai trò quan trọng trong Laravel.

Migrations là gì ?

Bạn có thể hiểu Migrations trong Laravel 5 giống như một version control của database, 1 tính năng giúp bạn quản lý các version của database. Migrations trong Laravel 5 cho phép bạn chỉnh sửa scheme database, cập nhật trang thái hiện tại của database. Migrations giúp cho việc quản lý database của bạn trở nên đễ dàng hơn.

Cấu hình database

Trước tiên để có thể sử dụng được migrations trong Laravel 5, thì bạn phải cấu hình cho Laravel biết được các thông tin cần thiết để kết nối đến database.

Các bạn lưu ý, khi cấu hình kết nối đến database Laravel 5 sẽ cung cấp cho chúng ta 2 file cấu hình như sau:

1. laravel-5/.env (chỉ sử dụng để chạy ở localhost)

2. laravel-5/config/database.php (dùng để chạy khi sản phẩm đã được đưa thành production)

Như các bạn đã biết, chúng ta đang chạy Laravel ở localhost, nên khi kết nối đến database, ta sẽ dùng file thứ 1 .env  để chỉnh cấu hình kết nối đến database mà không cần đụng tới file thứ 2 database.php vì chỉ khi nào đưa sản phẩm Laravel hoàn thiện lên production thì ta mới cần tới nó.

Nhưng ở đây mình cũng sẽ giới thiệu sơ lược về cách cấu hình ở production để các bạn nắm sơ qua để biết khi cần dùng đến sau này.

1. Cấu hình database cho production

Khi mở lên các bạn sẽ thấy file config/database.php có nội dung như sau:

<?php

return [

	/*
	|--------------------------------------------------------------------------
	| PDO Fetch Style
	|--------------------------------------------------------------------------
	|
	| By default, database results will be returned as instances of the PHP
	| stdClass object; however, you may desire to retrieve records in an
	| array format for simplicity. Here you can tweak the fetch style.
	|
	*/

	'fetch' => PDO::FETCH_CLASS,

	/*
	|--------------------------------------------------------------------------
	| Default Database Connection Name
	|--------------------------------------------------------------------------
	|
	| Here you may specify which of the database connections below you wish
	| to use as your default connection for all database work. Of course
	| you may use many connections at once using the Database library.
	|
	*/

	'default' => 'mysql',

	/*
	|--------------------------------------------------------------------------
	| Database Connections
	|--------------------------------------------------------------------------
	|
	| Here are each of the database connections setup for your application.
	| Of course, examples of configuring each database platform that is
	| supported by Laravel is shown below to make development simple.
	|
	|
	| All database work in Laravel is done through the PHP PDO facilities
	| so make sure you have the driver for your particular database of
	| choice installed on your machine before you begin development.
	|
	*/

	'connections' => [

		'sqlite' => [
			'driver'   => 'sqlite',
			'database' => storage_path().'/database.sqlite',
			'prefix'   => '',
		],

		'mysql' => [
			'driver'    => 'mysql',
			'host'      => env('DB_HOST', '127.0.0.1'),
			'database'  => env('DB_DATABASE', 'your-database'),
			'username'  => env('DB_USERNAME', 'your-db-username'),
			'password'  => env('DB_PASSWORD', 'your-db-pasword'),
			'charset'   => 'utf8',
			'collation' => 'utf8_unicode_ci',
			'prefix'    => '',
			'strict'    => false,
		],

		'pgsql' => [
			'driver'   => 'pgsql',
			'host'     => env('DB_HOST', 'localhost'),
			'database' => env('DB_DATABASE', 'forge'),
			'username' => env('DB_USERNAME', 'forge'),
			'password' => env('DB_PASSWORD', ''),
			'charset'  => 'utf8',
			'prefix'   => '',
			'schema'   => 'public',
		],

		'sqlsrv' => [
			'driver'   => 'sqlsrv',
			'host'     => env('DB_HOST', 'localhost'),
			'database' => env('DB_DATABASE', 'forge'),
			'username' => env('DB_USERNAME', 'forge'),
			'password' => env('DB_PASSWORD', ''),
			'prefix'   => '',
		],

	],

	/*
	|--------------------------------------------------------------------------
	| Migration Repository Table
	|--------------------------------------------------------------------------
	|
	| This table keeps track of all the migrations that have already run for
	| your application. Using this information, we can determine which of
	| the migrations on disk haven't actually been run in the database.
	|
	*/

	'migrations' => 'migrations',

	/*
	|--------------------------------------------------------------------------
	| Redis Databases
	|--------------------------------------------------------------------------
	|
	| Redis is an open source, fast, and advanced key-value store that also
	| provides a richer set of commands than a typical key-value systems
	| such as APC or Memcached. Laravel makes it easy to dig right in.
	|
	*/

	'redis' => [

		'cluster' => false,

		'default' => [
			'host'     => '127.0.0.1',
			'port'     => 6379,
			'database' => 0,
		],

	],

];

Tại dòng

‘default’ => ‘mysql’,

Đây chính là loại cơ sở dữ liệu mà bạn sẽ dự định kết nối tới, mặc định nó là mysql, ngoài ra bạn có thể chọn sqlite, postgres,…

Sau khi đã chọn cơ sở dữ liệu, bạn phải tiếp tục điền các thông tin cấu hình cần thiết cho loại cơ sở dữ liệu đó. Ví dụ như ở đây mình xài là mysql thì mình sẽ chỉnh lại thông tin cấu hình như sau :

'mysql' => [
			'driver'    => 'mysql',
			'host'      => env('DB_HOST', 'ten-host'),
			'database'  => env('DB_DATABASE', 'ten-database'),
			'username'  => env('DB_USERNAME', 'username-database'),
			'password'  => env('DB_PASSWORD', 'password-database'),
			'charset'   => 'utf8',
			'collation' => 'utf8_unicode_ci',
			'prefix'    => '',
			'strict'    => false,
		],

Với

Gợi ý : Bạn là người mới và muốn tìm hiểu về Bitcoin nhưng không biết bắt đầu từ đâu? Click xem ngay Hướng Dẫn Đầu Tư Bitcoin Cho Người Mới nhé!

  • ten-host : tên host của bạn
  • ten-database : tên cơ sở dữ liệu của bạn,
  • username-db : username đăng nhập vào db,
  • password-db : password đăng nhập vào db của bạn.

2. Cấu hình ở local

Đây là phần cấu hình mà chúng ta sẽ sử dụng vì hiện tại Laravel 5 đang được setup chạy ở local.

Như đã nói ở trên, để cấu hình DB ở local thì các bạn sử dụng file .env

Mở file này lên và bạn cấu hình như dưới đây

APP_ENV=local
APP_DEBUG=true
APP_KEY=jnGIndjFo8F1i3PhgSfzodig50YoS4pc

DB_HOST=ten-host
DB_DATABASE=ten-db
DB_USERNAME=username-db
DB_PASSWORD=password-db

CACHE_DRIVER=file
SESSION_DRIVER=file

Với

  • ten-host : bạn điền vào tên host, ở đây là localhost
  • ten-database : bạn điền vào tên database mà bạn đã tạo
  • username-db : bạn điền vào username dùng để đăng nhập db, ở đây thường là root (mặc định đối với wamp hoặc xampp)
  • password-db : bạn điền vào password dùng để đăng nhập db, ở đây thường là rỗng (mặc định đối với wamp hoặc xampp)

Sau khi điền đẩy đủ thông tin vào file .env như ở trên là bạn đã cấu hình xong kết nối đến database ở local. Tiếp đến chúng ta sẽ vào chủ để chính đó là sử dụng migrations trong Laravel.

Sử dụng migrations trong laravel 5

Đầy là phần chính trong bài viết ngày hôm nay, nên nó sẽ khá dài vì mình sẽ cố gắng viết thật chi tiết. Các bạn cố gắng theo dõi ha.

Việc đầu tiên khi sử dụng migrations trong Laravel 5 là bạn cần phải kiểm tra xem migrations đã hoạt động tốt trong Laravel hay chưa. Trong window, mở cmd (Ấn phím window, trong box Search programs and files, gõ cmd, rồi enter), rồi di chuyển đến thư mục chứa Laravel 5 của chúng ta

cd C:/wamp/www/laravel-5

Tiếp đến các bạn gõ lệnh sau

php artisan migrate

nếu không thấy thông báo lỗi nào hiện ra như hình dưới

cài đặt migration thành công

là các bạn đã cấu hình kết nối đến database thành công, còn không các bạn hãy kiểm tra lại thông tin cấu hình ở trên.

Sau khi chạy lệnh trên, Laravel 5 đồng thời đã thực thi 2 file trong thư mục laravel-5/database/migrations đó là 2014_10_12_000000_create_users_table.php và 2014_10_12_100000_create_password_resets_table.php

cấu trúc thư mục migrations

và tạo ra 2 bảng là user và password_resets trong database . Để kiểm tra bạn có thể vào phpmyadmin, chọn database đã tạo trước đó của bạn (ở đây là laravel5), bạn sẽ thấy 2 bảng là users và password_resets đã được tạo ra. Đây chính là 2 bảng mặc định laravel5 dùng cho mục đích lưu thông tin user và reset lại password khi bạn cần dùng đến sau này.

Đến đây, các bạn cũng đã phần nào mường tượng được tính năng của migrations trong laravel rồi phải không? Nhìn 1 chút sơ qua 2 file trong thư mục migrations, bạn sẽ thấy 2 function là up() và down(). Function up() thường là dùng để tạo bảng, function down() thường có chức năng dùng để rollback lại trang thái ban đầu tại thời điểm mà function up() chưa được thực thi. Chức năng của function down() thường là xóa bảng (drop table).

Nhìn sơ qua 1 tí về function up() trong file 2014_10_12_000000_create_users_table.php

public function up()
	{
		Schema::create('users', function(Blueprint $table)
		{
			$table->increments('id');
			$table->string('name');
			$table->string('email')->unique();
			$table->string('password', 60);
			$table->rememberToken();
			$table->timestamps();
		});
	}

Bạn sẽ thấy rằng đây là function có tác dụng tạo ra bảng users, với

id : thuộc tính tự tăng

name : kiểu string

email : kiểu string, thuộc tính unique

password : kiểu string, độ dài 60

….

Và khi chạy lệnh

php artisan migrate

hệ thống sẽ thực thi function up() này và tạo ra bảng users trong database. Tương tự ngược lại, với lệnh

php artisan migrate:rollback

hệ thống sẽ thực thi function down()

public function down()
	{
		Schema::drop('users');
	}

và xóa bảng users (để kiểm tra các bạn vào phpmyadmin, lúc này database của bạn sẽ không còn bảng users nữa).

OK, nói đến đây thì các bạn cũng đã phần nào hiểu về migrations rồi phải không nào ? Migrations đó là cách mà Laravel giúp ta tương tác với database mà không cần phải đụng vào database, chỉ cần thao tác trên các function dựng sẵn của Laravel. Ngoài ra Migrations giúp ta quản lý các phiên bản (version) của Laravel được dễ dàng hơn.

Nếu vẫn còn khó hiểu và  để hiểu rõ hơn về Migrations, thì chúng ta cùng nhau làm ví dụ để hiểu rõ hơn

Ví dụ về Migrations trong Laravel 5

Giả sử như giờ mình muốn tạo ra bảng mới đặt tên là articles dùng để chưa các bài viết mình sẽ làm như sau:

1. Gõ lệnh

php artisan make:migration create_articles_table --create="articles"

migartions-articles

vào thư mục database/migrations bạn sẽ thấy file 2015_03_01_042501_create_articles_table.php vừa được tạo với nội dung:

<?php

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

class CreateArticlesTable extends Migration {

	/**
	 * Run the migrations.
	 *
	 * @return void
	 */
	public function up()
	{
		Schema::create('articles', function(Blueprint $table)
		{
			$table->increments('id');
			$table->timestamps();
		});
	}

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

}

2. Gõ tiếp lệnh

php artisan migrate

để thực thi file vừa tạo ở trên, vào database bạn sẽ thấy bảng articles đã được tạo với 3 column là id, created_at, updated_at.

3. Nếu như bạn muốn thêm 1 vài column mới vào bảng articles thì bạn sẽ làm như thế nào ? Ở đây mình sẽ chỉ cho các bạn cách mình hay dùng, đơn giản là thực thi hàm down() để xóa lại bảng articles vừa tạo bằng lệnh

php artisan migrate:rollback

sau đó, trong function up() edit lại để thêm các cột mới như name, author,…

public function up()
	{
		Schema::create('articles', function(Blueprint $table)
		{
			$table->increments('id');
			$table->string('name'); //thêm cột name
			$table->string('author'); // thêm cột author
			$table->timestamps();
		});
	}

rồi chạy lại lệnh

php artisan migrate

để tao lại bảng articles là được. Cách này hơi cùi, vì ở Laravel 5 đã có hỗ trợ bạn thêm cột mới bằng lệnh migrations luôn. Mình sẽ nhắc đến nó trong các bài viết tới.

Đến đây thì bạn đã phần nào nắm được cách hoạt động của migrations trong laravel 5, nếu bạn có bất kỳ thắc mắc nào thì để lại comment bên dưới nhé.

Laravel là một framework tốt nhất, đứng TOP 1 trong 3 năm liền. Tại Việt Nam nhu cầu tuyển dụng ứng viên Laravel rất nhiều, nếu bạn có khả năng về Laravel Framework, đây sẽ là cơ hội nghề nghiệp rất lớn dành cho bạn. Vì lý do đó, nếu như có một khóa học dạy tạo website với Laravel 5, học xong thì bạn đủ khả năng để có một công việc ổn định và giá khóa học rất rẻ, lại còn giảm giá 40%. Bạn sẽ tham giá chứ? Nếu câu trả lời là có, bạn có thể tham khảo tại đây.

Chúc các bạn học tốt !

Thân ái !

Có ích

học laravel 5

Bài 8 : Form trong Laravel 5

Ở bài trước, mình đã hướng dẫn cho các bạn về mô hình MVC trong …

38 bình luận

  1. [symfony\component\Exception\FatalThrowableError]
    parse error: syntax error, unexpected ‘public’, expecting end of file

    Khi mình gõ câu lệnh php artisan migrate xong nhấn enter thì ở CMD thông báo lỗi như vậy là sao bạn?

  2. bác nào cho e hỏi là: e có tạo table 1 bằng lệnh migrate trước đó rồi (và trong table đã có data). Sau đó lại muốn tạo thêm 1 bảng table 2 nữa. Lại chạy lệnh “php artisan migrate” thì nó báo: “table 1 đã tồn tại” và k tạo được bảng thứ 2. vậy muốn tạo tiếp thì làm như thế nào ạ?.

  3. [Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

    • ALTER TABLE `users ` ADD UNIQUE ( column1(number_1), column2(number_2) ); number_1 và number_2 là 2 số bạn cần truyền vào, vì quá giới hạn cho phép, thử number_1= 15, number_2 = 15 xem sao

  4. PDOException in Connector.php line 49:
    SQLSTATE[HY000] [1045] Access denied for user ‘homestead’@’localhost’ (using password: YES)
    e bấm artisan migrate thì lỗi đó thì sao a ??

  5. Quá hay. Vì mình đã vững Code first Migration trong .NET rồi nên học cái này nhanh. Tựa như nhau :v

  6. sao tới phần thêm 2 field name và author xong rồi chạy lệnh php artisan migrate thì nó báo “Nothing to migrate” vậy bạn.

  7. Bạn cho mình hỏi nếu mình dùng mongoDB thì làm sao để tích hợp với Laravel 5 ??

  8. ad ơi cho mình hỏi. là mình dùng lệnh php artisan make:model nó chỉ tạo ra được mỗi model mà không tạo được migraton. cám ơn ad nhiều nha

  9. A ơi sao file .env của e ko thấy nhỉ. Trong ổ laravel thì có nhưng khi code ở trên neetbean lại ko có

  10. Bài viết hay quá 🙂

  11. Mình đã chạy lệnh tạo bảng thành công, và trong thư mục database/migration đã có file cho articles nhưng nội dung file không giống bán mô tả:

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

    class CreateArticlesTable extends Migration {

    /**
    * Run the migrations.
    *
    * @return void
    */
    public function up()
    {
    Schema::create(‘articles’, function(Blueprint $table)
    {
    $table->increments(‘id’);
    $table->timestamps();
    });
    }

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

    }

    Tiếp theo, mình chạy lệnh php artisan migrate để update table nhưng trong database không thấy có.
    Cả hai lệnh chạy trên cmd thì không thấy báo error nào cả.
    Vậy mình muốn add và edit colum của table này sẽ như thế nào vậy bạn?

  12. Mình chạy lệnh để tạo bảng articles trên cmd oki rồi. Nhưng mở file của nó trong database/migration thì nó như zày:

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

    class CreateArticlesTable extends Migration {

    /**
    * Run the migrations.
    *
    * @return void
    */
    public function up()
    {
    Schema::create(‘articles’, function(Blueprint $table)
    {
    $table->increments(‘id’);
    $table->timestamps();
    });
    }

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

    }

    ==> không giống file của bạn. Và mình chạy tiếp lệnh php artisan migrate, nhưng vào database vẫn khong thấy cập nhất table mới.

    Hai lệnh chạy đều không thấy errors.
    Không biết là vì sao? và muốn thêm cột hoạc chỉnh sửa cột thế nào nữa?

  13. bạn ơi, mình muốn sử dụng mongodb trong laravel nhưng ko biết nó có hỗ trợ ko ?

  14. Cho mình hỏi ở bước xóa bảng. Làm cách nào để hiểu được là mình đang xóa bảng nào? Hay chính xác hơn là mình đang thao tác với bảng nào? Cảm ơn bạn !

  15. em bị lỗi access denied for user mà không hiểu sao, em cấu hình y hệt như vậy rồi

    • Nếu source của bạn đang chạy ở local thì nhớ chỉnh thông tin trong file .env nha. Nếu đã chỉnh rồi thì thử cách này, trong thư mục chứa laravel, bạn gõ “php artisan serve” , sau đó chạy lại “php artisan migrate” thử xem sao nhé, nếu ko được nữa thì bạn vui lòng cho mình biết là bạn dùng xampp, wamp hay gì để chạy laravel.Thân !

    • Hoặc ko được nữa thì thử gõ tiếp lệnh này nhé : php artisan fresh hoặc php artisan config:clear rồi chạy php artisan migrate lại xem sao nhé

  16. bạn có project mẫu nào làm từng bước để cho mình hiểu cách triển khai một dự án thật bằng laravel ko
    mình đang làm bt lớn tạo một website quản lý nhân viên

    • Các dự án mình làm thường sử dụng nhiều ngôn ngữ lập trình khác nhau, không cố định nên mình ko có dự án laravel cho bạn tham khảo. Nhưng mình muốn nói với bạn thế này, bất cữ một framework nào cũng thường là thêm xóa sửa theo mô hình MVC cộng với các thư viện bổ trợ, chỉ cần bạn nắm được cách mà dữ liệu được truy vấn hoặc cập nhật theo MVC là bạn có thể mở rộng ra theo yêu cầu . Bạn có thể tham khảo bài viết này để biết cách truy vấn dữ liệu : kungfuphp.com/laravel-framework/mo-hinh-mvc-trong-laravel-5.html và bài này https://kungfuphp.com/laravel-framework/form-trong-laravel-5.html để cập nhật dữ liệu. Chúc bạn học tốt

  17. Mình bị lỗi
    1045 access denied for user ‘root’@’localhost’
    măc dù đã điền đầy đủ thông tin,ko hiểu sao :-ss

  18. tiếp nhiều bài về laravel đi bác, hay quá 🙂

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *