Laravel là một trong những framework phổ biến nhất hiện nay trong lập trình web. Nó cung cấp cho các lập trình viên một cách tiếp cận tổng thể để phát triển các ứng dụng web, từ quản lý cơ sở dữ liệu đến quản lý bảo mật và chức năng giao tiếp với người dùng.
Model là khái niệm trong MVC cũng như laravel và là một phần quan trọng trong kiến trúc Model-View-Controller (MVC). Model là lớp đại diện cho dữ liệu được lưu trữ trong cơ sở dữ liệu(CSDL), và cung cấp các phương thức để truy vấn, tạo, cập nhật và xóa dữ liệu.
Trong bài viết này, chúng ta sẽ tìm hiểu về model trong Laravel, bao gồm cách tạo, cấu hình, quản lý và sử dụng chúng trong ứng dụng Laravel.
Các khái niệm cơ bản về model trong Laravel
Trong Laravel, một model là một lớp đại diện cho một bảng trong cơ sở dữ liệu(CSDL). Nó chứa các thuộc tính và phương thức để thao tác với dữ liệu trong bảng tương ứng.
Mỗi model trong Laravel được đặt tên theo quy ước CamelCase và phải kế thừa từ lớp Illuminate\Database\Eloquent\Model. Nếu bạn sử dụng một tên bảng khác với quy ước của Laravel, bạn cần phải cấu hình tên bảng bằng cách đặt thuộc tính $table trong model.
Ví dụ, nếu bạn có một bảng tên là users, bạn có thể tạo một model tương ứng bằng cách sử dụng lệnh Artisan make:model như sau:
php artisan make:model User
Sau đó, Laravel sẽ tạo một file User.php trong thư mục app/Models của ứng dụng Laravel.
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'users';
}
Theo mặc định, Laravel sử dụng quy ước "số nhiều" để ánh xạ giữa tên bảng và tên model. Ví dụ, nếu bạn có một bảng tên là photos, Laravel sẽ tìm kiếm một model tên là Photo. Nếu bạn muốn sử dụng một tên model khác với quy ước này, bạn có thể đặt thuộc tính $table như sau:
protected $table = 'my_photos';
Ngoài ra, bạn cũng có thể định các quan hệ giữa các model - (Relationship Laravel) bằng cách sử dụng các phương thức của lớp Illuminate\Database\Eloquent\Model. Các quan hệ này bao gồm:
- Một-một (One-to-One): Một bản ghi trong bảng này tương ứng với một bản ghi trong bảng khác.
- Một-nhiều (One-to-Many): Một bản ghi trong bảng này có thể tương ứng với nhiều bản ghi trong bảng khác.
- Nhiều-nhiều (Many-to-Many): Một bản ghi trong bảng này có thể tương ứng với nhiều bản ghi trong bảng khác, và ngược lại.
- Ngoài ra thì còn một số quan hệ khác như: Has Many Through, Polymorphic Relations, Many To Many Polymorphic Relations
Để định nghĩa các quan hệ này, bạn cần sử dụng các phương thức hasOne(), hasMany() và belongsToMany() của model. Ví dụ, nếu bạn có một bảng users và một bảng posts, và mỗi user có nhiều post, bạn có thể định nghĩa quan hệ giữa các model như sau:
// Bảng user
class User extends Model
{
public function posts()
{
return $this->hasMany(Post::class);
}
}
// Bảng Post
class Post extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
Trong ví dụ này, phương thức hasMany() của model User được sử dụng để định nghĩa quan hệ "một-nhiều" giữa các model. Phương thức này trả về một đối tượng Illuminate\Database\Eloquent\Relations\HasMany đại diện cho quan hệ giữa các model.
Tương tự, phương thức belongsTo() là phương thức đảo ngược của model Post được sử dụng để định nghĩa quan hệ "nhiều-một" giữa các model. Phương thức này trả về một đối tượng Illuminate\Database\Eloquent\Relations\BelongsTo đại diện cho quan hệ giữa các model.
Sau khi định nghĩa quan hệ giữa các model, bạn có thể sử dụng chúng để truy vấn dữ liệu từ cơ sở dữ liệu. Ví dụ, để lấy tất cả các post của một user cụ thể, bạn có thể sử dụng mã sau:
$user = User::find(1);
$posts = $user->posts;
Trong đoạn code này, User::find(1) được sử dụng để tìm kiếm user có id là 1 trong cơ sở dữ liệu. Sau đó, $user->posts được sử dụng để lấy tất cả các post của user đó. Ngoài ra nếu bạn muốn lấy 10 bài viết trong posts thì bạn cũng có thể sử dụng
$posts = $user->posts->take(10)->get();
Sau khi định nghĩa model, bạn có thể sử dụng nó để tạo và cập nhật dữ liệu trong cơ sở dữ liệu. Laravel cung cấp cho bạn một số phương thức để làm điều này, bao gồm create(), update() và save(), updateOrCreate().
Tạo trường dữ liệu mới với phương thức create
Để tạo bản ghi (trường dữ liệu) mới trong cơ sở dữ liệu(CSDL) bằng Laravel, bạn có thể sử dụng phương thức create() của model. Ví dụ, nếu bạn có một bảng users và muốn tạo một bản ghi mới với các trường name, email và password, bạn có thể sử dụng mã sau:
$user = User::create([
'name' => 'Hozitech',
'email' => '[email protected]',
'password' => bcrypt('password'),
]);
Trong đoạn mã này, phương thức create() của model User được sử dụng để tạo một bản ghi mới với các trường được chỉ định. Phương thức này trả về đối tượng User đại diện cho bản ghi vừa được tạo ra.
Lưu ý rằng bạn cần phải chắc chắn rằng các trường được chỉ định trong phương thức create() có tồn tại trong bảng tương ứng. Nếu không, Laravel sẽ báo lỗi.
Cập nhật các trường dữ liệu với phương thức update
Để cập nhật bản ghi(trường dữ liệu) trong cơ sở dữ liệu(CSDL) bằng Laravel, bạn có thể sử dụng phương thức update() của model. Ví dụ, nếu bạn muốn cập nhật trường name của một bản ghi trong bảng users, bạn có thể sử dụng mã sau:
$user = User::find(1);
$user->update([
'name' => 'Hozitech Company',
]);
Trong đoạn mã này, User::find(1) được sử dụng để tìm kiếm user có id là 1 trong cơ sở dữ liệu. Sau đó, phương thức update() được sử dụng để cập nhật trường name của user đó. Phương thức này trả về true nếu cập nhật thành công và false nếu không thành công.
Lưu trường dữ liệu với phương thức save
Ngoài phương thức create() và update(), bạn có thể sử dụng phương thức save() để lưu bản ghi của model. Phương thức này được sử dụng khi bạn muốn cập nhật một bản ghi đã có trong cơ sở dữ liệu hoặc khi bạn muốn lưu một bản ghi mới mà bạn đã tạo ra bằng cách sử dụng hàm khởi tạo của model.
Ví dụ, nếu bạn muốn lưu một bản ghi mới trong bảng users, bạn có thể sử dụng mã sau:
$user = User::find(1);
$user->name = 'Jane Doe';
$user->save();
Trong đoạn mã này, User::find(1) được sử dụng để tìm kiếm user có id là 1 trong cơ sở dữ liệu. Sau đó, trường name của user đó được cập nhật thành 'Jane Doe'. Cuối cùng, phương thức save() được sử dụng để lưu các thay đổi của bản ghi vào cơ sở dữ liệu.
Lưu ý rằng khi bạn sử dụng phương thức save() để lưu một bản ghi mới, Laravel sẽ tự động tạo ra một bản ghi mới trong cơ sở dữ liệu với các trường được chỉ định trong đối tượng model.
Xóa dữ liệu với Model
Để xóa một bản ghi trong cơ sở dữ liệu, bạn có thể sử dụng phương thức delete() của model. Ví dụ, để xóa một user có id là 1, bạn có thể sử dụng đoạn mã sau:
$user = User::find(1);
$user->delete();
Nếu bạn muốn xóa nhiều bản ghi cùng một lúc, bạn có thể sử dụng phương thức whereIn() để chỉ định một mảng các id của các bản ghi muốn xóa. Ví dụ, để xóa tất cả users có id là 1, 2 và 3, bạn có thể sử dụng đoạn mã sau:
User::whereIn('id', [1, 2, 3])->delete();
Ngoài ra laravel còn hỗ trợ cho bạn một phương thưc sort delete trong laravel (Xoá mềm). Không giống như xoá cứng xoá mềm chỉ đơn giản là ẩn đi một record. Để sử dụng sort delete trong laravel bạn hãy use phương thức này vào trong model, và thêm vào migration như đoạn code phía dưới.
class Post extends Model
{
use SoftDeletes;
....
}
// Thêm trong migration
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->softDeletes(); // add
});
}
Tạo migration
Migration là một cơ chế để quản lý các thay đổi của cơ sở dữ liệu. Laravel cung cấp một công cụ để tạo và quản lý migration.
Để tạo một migration mới, bạn có thể sử dụng lệnh Artisan make:migration. Ví dụ, để tạo một migration mới với tên là create_users_table, bạn có thể sử dụng đoạn mã sau:
php artisan make:migration create_users_table
Sau khi chạy lệnh trên, Laravel sẽ tạo ra một file migration mới với tên có dạng {timestamp}_create_users_table.php trong thư mục database/migrations. File migration này chứa một class migration với phương thức up() và down().
Phương thức up() được sử dụng để thực hiện các thay đổi trên cơ sở dữ liệu, ví dụ như tạo bảng mới hoặc thêm một trường mới vào bảng đã có. Phương thức down() được sử dụng để hoàn tác các thay đổi đó, tức là xóa bảng hoặc xóa trường đã được thêm vào.
Ví dụ, để tạo một bảng users với các trường id, name, email và password, bạn có thể sử dụng đoạn mã sau trong phương thức up():
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
Ở đây, Schema::create() được sử dụng để tạo ra bảng users. Phương thức này nhận vào tên của bảng và một closure để định nghĩa các trường của bảng đó. Trong closure này, bạn có thể sử dụng các phương thức của đối tượng $table để thêm các trường vào bảng.
Chạy migration
Sau khi tạo migration, bạn cần chạy nó để áp dụng các thay đổi lên cơ sở dữ liệu. Để chạy tất cả các migration chưa được chạy, bạn có thể sử dụng lệnh Artisan migrate:
php artisan migrate
Nếu bạn chỉ muốn chạy migration mới nhất, bạn có thể sử dụng tham số --path để chỉ định thư mục chứa migration đó. Ví dụ, để chạy migration mới nhất trong thư mục database/migrations/create_users_table.php, bạn có thể sử dụng đoạn mã sau:
php artisan migrate --path=database/migrations/create_users_table.php
Nếu bạn muốn hoàn tác các thay đổi đã áp dụng lên cơ sở dữ liệu, bạn có thể sử dụng lệnh migrate:rollback. Lệnh này sẽ hoàn tác migration mới nhất đã được chạy.
Để hoàn tác nhiều migration cùng một lúc, bạn có thể sử dụng tham số --step để chỉ định số lượng migration muốn hoàn tác. Ví dụ, để hoàn tác 3 migration gần nhất, bạn có thể sử dụng đoạn mã sau:
php artisan migrate:rollback --step=3
Seeder
Seeder là một cơ chế để khởi tạo dữ liệu mẫu trong cơ sở dữ liệu. Laravel cung cấp một công cụ để tạo và quản lý seeder.
Để tạo một seeder mới, bạn có thể sử dụng lệnh Artisan make:seeder. Ví dụ, để tạo một seeder mới với tên là UsersTableSeeder, bạn có thể sử dụng đoạn mã sau:
php artisan make:seeder UsersTableSeeder
Sau khi chạy lệnh trên, Laravel sẽ tạo ra một file seeder mới với tên là UsersTableSeeder.php trong thư mục database/seeders. File seeder này chứa một class seeder với phương thức run().
Trong phương thức run(), bạn có thể sử dụng các phương thức của đối tượng DB để thêm dữ liệu vào cơ sở dữ liệu. Ví dụ, để thêm một user mới vào bảng users, bạn có thể sử dụng đoạn mã sau:
public function run()
{
DB::table('users')->insert([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => bcrypt('password'),
]);
}
Sau khi định nghĩa seeder, bạn cần chạy nó để thêm dữ liệu vào cơ sở dữ liệu. Để chạy một seeder, bạn có thể sử dụng lệnh Artisan `db:seed. Ví dụ, để chạy seeder UsersTableSeeder`, bạn có thể sử dụng đoạn mã sau:
php artisan db:seed --class=UsersTableSeeder
Bạn cũng có thể chạy tất cả các seeder bằng cách sử dụng lệnh db:seed mà không truyền vào tham số --class.
Tuy nhiên, nếu bạn muốn chạy nhiều seeder cùng một lúc, bạn có thể sử dụng phương thức call() để gọi các seeder khác nhau trong phương thức run(). Ví dụ, để gọi các seeder UsersTableSeeder và PostsTableSeeder, bạn có thể sử dụng đoạn mã sau:
public function run()
{
$this->call(UsersTableSeeder::class);
$this->call(PostsTableSeeder::class);
}
Laravel cũng cung cấp một số phương thức hữu ích để thêm dữ liệu vào cơ sở dữ liệu trong seeder. Bạn có thể sử dụng phương thức factory() để tạo dữ liệu mẫu theo các quy tắc được xác định trong model factory. Ví dụ, để tạo 10 users mới, bạn có thể sử dụng đoạn mã sau:
public function run()
{
factory(App\User::class, 10)->create();
}
Bạn cũng có thể sử dụng phương thức create() để tạo một bản ghi mới trong cơ sở dữ liệu. Ví dụ, để thêm một user mới vào cơ sở dữ liệu, bạn có thể sử dụng đoạn mã sau:
public function run()
{
App\User::create([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => bcrypt('password'),
]);
}
Tổng kết
Trong bài viết này, chúng tôi đã giới thiệu về các khái niệm quan trọng về model trong Laravel, bao gồm:
- Cách tạo model bằng Artisan make:model
- Các thuộc tính và phương thức của model, bao gồm fillable, guarded, timestamps, primaryKey, table, hasMany, belongsTo, hasOne, belongsToMany, morphTo, morphMany và morphToMany
- Cách tạo migration bằng Artisan make:migration và sử dụng các phương thức của đối tượng Schema để tạo bảng và chỉnh sửa cấu trúc cơ sở dữ liệu
- Cách chạy migration bằng Artisan migrate và hoàn tác migration bằng Artisan migrate:rollback
- Cách tạo seeder bằng Artisan make:seeder và sử dụng các phương thức của đối tượng DB để thêm dữ liệu vào cơ sở dữ liệu trong seeder.
Các khái niệm này rất quan trọng đối với việc phát triển ứng dụng Laravel, và chúng tôi hy vọng rằng bạn đã có được những kiến thức cần thiết để bắt đầu tạo ra các model, migration và seeder trong ứng dụng của mình.
Tuy nhiên, để hoàn thành một ứng dụng Laravel, bạn cần hơn những kiến thức về model, migration và seeder. Để trở thành một lập trình viên Laravel chuyên nghiệp, bạn cần phải học thêm nhiều khái niệm khác, chẳng hạn như:
- Routing: Các tuyến đường của ứng dụng, cho phép người dùng truy cập vào các trang và tài nguyên khác nhau
- Controllers: Các thành phần xử lý logic của ứng dụng, xử lý yêu cầu từ người dùng và trả về các phản hồi thích hợp
- Views: Các giao diện người dùng của ứng dụng, cho phép người dùng tương tác với các dữ liệu và chức năng của ứng dụng
- Middleware: Các thành phần trung gian xử lý yêu cầu trước khi chúng đến được tới các controllers
- Authentication: Các thành phần xác thực người dùng, cho phép ứng dụng kiểm tra xem người dùng đã đăng nhập hay chưa và kiểm soát quyền truy cập của người dùng đến các tài nguyên khác nhau
Mong chia sẽ trên về model trong laravel sẽ giúp bạn hiểu được model trong laravel là gì? Và cách sử dụng model trong laravel trong quá trình chinh phục framework này. Ngoài ra bạn có thể tham khảo thêm các bài viết trong seri học Laravel của Hozitech phía dưới.
Laravel là gì? Ưu và nhược điểm của laravel.
Controller trong laravel là gì? Các thành phần cơ bản của controller.