Laravel Model là gì? Vai trò cốt lõi trong thao tác dữ liệu

Laravel Model là gì?

Trong một ứng dụng Laravel, dữ liệu từ cơ sở dữ liệu không nên được xử lý tùy ý ở mọi nơi trong mã nguồn. Laravel cung cấp Model để đại diện cho dữ liệu và cung cấp cách làm việc với database thông qua Eloquent ORM. Khi sử dụng Model, lập trình viên có thể truy vấn, thêm, sửa, xóa dữ liệu và xây dựng quan hệ giữa các bảng bằng cú pháp PHP rõ ràng. Vậy Laravel Model là gì, Model có vai trò gì và được sử dụng như thế nào trong một ứng dụng thực tế?

Laravel Model là gì?

Laravel Model là một lớp PHP đại diện cho một loại dữ liệu trong ứng dụng và thường được ánh xạ với một bảng trong cơ sở dữ liệu. Laravel sử dụng Eloquent ORM để Model có thể tương tác với database mà không cần viết SQL cho những thao tác phổ biến.

Ví dụ, ứng dụng có bảng users và Model tương ứng:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    //
}

Model User thường được sử dụng để làm việc với bảng users.

Khi đó có thể lấy danh sách người dùng:

$users = User::all();

Hoặc tìm một người dùng:

$user = User::find(1);

Thay vì trực tiếp viết:

SELECT * FROM users WHERE id = 1;

Model giúp đưa thao tác dữ liệu vào lớp PHP có cấu trúc rõ ràng hơn.

Laravel Model là gì?
Laravel Model là gì?

Laravel Model có vai trò gì?

Model không chỉ đơn giản là lớp dùng để truy vấn database. Trong Laravel, Model thường đảm nhiệm ba nhóm công việc chính:

  • Đại diện cho dữ liệu và bảng trong database.
  • Thực hiện các thao tác CRUD.
  • Định nghĩa quan hệ giữa các loại dữ liệu.
READ  Laravel Request là gì? Cách xử lý dữ liệu người dùng gửi lên

Ví dụ, với Model Product, ứng dụng có thể thực hiện:

$products = Product::all();

$product = Product::find(10);

Hoặc thêm dữ liệu:

$product = new Product();
$product->name = 'Laptop';
$product->price = 1500;
$product->save();

Nhờ đó, Controller hoặc các lớp khác có thể sử dụng Model để làm việc với dữ liệu mà không cần chứa quá nhiều câu SQL.

Đây là một phần quan trọng trong cách Laravel tổ chức ứng dụng theo mô hình MVC. Nếu đang xây dựng nền tảng kiến thức từ nền tảng, Laravel cơ bản sẽ giúp kết nối Model với các thành phần như Controller, View và Eloquent.

Tạo Laravel Model

Laravel cung cấp Artisan để tạo Model nhanh chóng:

php artisan make:model Product

Lệnh này tạo file:

app/Models/Product.php

Một Model cơ bản:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    //
}

Trong nhiều trường hợp, tên Model được Laravel dùng để suy luận tên bảng.

Ví dụ:

Product → products
User → users
Order → orders

Nếu tên bảng không theo quy ước, có thể khai báo thủ công:

class Product extends Model
{
    protected $table = 'my_products';
}

Nhờ quy ước này, Laravel giảm đáng kể lượng cấu hình cần viết khi Model và database có cấu trúc thông thường.

Laravel Model thao tác dữ liệu như thế nào?

Một trong những vai trò quan trọng nhất của Model là thực hiện các thao tác CRUD.

Lấy dữ liệu

Lấy toàn bộ bản ghi:

$products = Product::all();

Tìm theo ID:

$product = Product::find(1);

Tìm bản ghi đầu tiên thỏa điều kiện:

$product = Product::where('status', 'active')->first();

Có thể kết hợp nhiều điều kiện:

$products = Product::where('status', 'active')
    ->where('price', '>', 100)
    ->get();

Kết quả từ get() thường là Eloquent Collection chứa các Model.

Thêm dữ liệu

Có thể tạo một Model mới và lưu vào database:

$product = new Product();

$product->name = 'Laptop';
$product->price = 1500;
$product->status = 'active';

$product->save();

Hoặc sử dụng create() khi Model đã được cấu hình Mass Assignment phù hợp:

$product = Product::create([
    'name' => 'Laptop',
    'price' => 1500,
    'status' => 'active',
]);

Với create(), cần chú ý cấu hình $fillable hoặc $guarded để kiểm soát các thuộc tính được phép Mass Assignment.

READ  Laravel Session là gì? Lưu trữ và quản lý phiên làm việc

Ví dụ:

protected $fillable = [
    'name',
    'price',
    'status',
];

Cập nhật dữ liệu

Lấy Model cần sửa rồi cập nhật:

$product = Product::find(1);

$product->price = 1800;
$product->save();

Hoặc cập nhật trực tiếp:

Product::where('id', 1)->update([
    'price' => 1800,
]);

Cách thứ hai phù hợp khi chỉ cần cập nhật dữ liệu mà không cần làm việc với một Model instance cụ thể.

Xóa dữ liệu

Có thể xóa một Model:

$product = Product::find(1);

$product->delete();

Hoặc xóa theo điều kiện:

Product::where('status', 'inactive')->delete();

Tùy cách thiết kế hệ thống, Model cũng có thể sử dụng Soft Deletes để đánh dấu bản ghi đã xóa thay vì xóa hoàn toàn khỏi database.

Model xử lý quan hệ giữa các bảng

Một vai trò quan trọng khác của Model là định nghĩa Relationships giữa các dữ liệu.

Ví dụ, một User có nhiều Post:

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

Trong Model Post:

class Post extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Sau đó có thể truy cập các bài viết của một user:

$user = User::find(1);

$posts = $user->posts;

Hoặc lấy User của một bài viết:

$post = Post::find(1);

$user = $post->user;

Model vì vậy không chỉ đại diện cho một bảng mà còn giúp mô tả mối quan hệ giữa các dữ liệu trong ứng dụng.

Model xử lý quan hệ giữa các bảng
Model xử lý quan hệ giữa các bảng

Một số cấu hình thường gặp trong Model

Model có thể chứa các cấu hình liên quan trực tiếp đến cách dữ liệu được xử lý.

Ví dụ chỉ định bảng:

protected $table = 'products';

Chỉ định khóa chính:

protected $primaryKey = 'product_id';

Cho phép Mass Assignment:

protected $fillable = [
    'name',
    'price',
];

Hoặc định nghĩa quan hệ:

public function category()
{
    return $this->belongsTo(Category::class);
}

Ngoài ra, Model còn hỗ trợ nhiều tính năng như Accessor, Mutator, Cast, Scope, Event và Soft Delete. Tuy nhiên, những tính năng này nên được sử dụng khi thực sự cần thiết thay vì đưa quá nhiều logic vào một Model.

READ  Laravel Framework là gì? Tổng quan từ A-Z cho người mới

Model nên chứa những gì?

Một Model nên tập trung vào dữ liệu và hành vi trực tiếp liên quan đến dữ liệu đó.

Ví dụ:

class Product extends Model
{
    protected $fillable = [
        'name',
        'price',
        'status',
    ];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

Trong khi đó, những logic nghiệp vụ phức tạp không nhất thiết phải dồn hết vào Model.

Một Controller có thể sử dụng Model như sau:

public function show($id)
{
    $product = Product::findOrFail($id);

    return view('products.show', compact('product'));
}

Controller tiếp nhận request và điều phối luồng xử lý, còn Model đảm nhiệm phần tương tác với dữ liệu.

Cách phân chia này giúp mã nguồn dễ đọc và bảo trì hơn khi ứng dụng phát triển.

Khi nào nên sử dụng Laravel Model?

Gần như mọi ứng dụng Laravel có làm việc với cơ sở dữ liệu đều sử dụng Model ở một mức độ nhất định.

Model đặc biệt phù hợp khi cần:

  • Thực hiện CRUD với database.
  • Đại diện cho bảng dữ liệu.
  • Xây dựng quan hệ giữa các bảng.
  • Truy vấn dữ liệu bằng Eloquent.
  • Tái sử dụng các truy vấn hoặc hành vi liên quan đến một loại dữ liệu.
  • Kết hợp dữ liệu với các tính năng của Eloquent như Scope, Cast hoặc Relationship.

Trong những trường hợp cần truy vấn phức tạp, báo cáo hoặc thao tác trực tiếp trên nhiều bảng, Query Builder có thể phù hợp hơn. Model và Query Builder không loại trừ nhau mà có thể được sử dụng kết hợp tùy vào yêu cầu của truy vấn.

Kết luận

Laravel Model là thành phần cốt lõi giúp ứng dụng làm việc với dữ liệu thông qua Eloquent ORM. Từ một Model, Laravel có thể thực hiện các thao tác lấy, thêm, sửa, xóa dữ liệu và định nghĩa quan hệ giữa các bảng. Hiểu rõ Model là bước quan trọng để làm việc hiệu quả với Eloquent. Khi đã nắm được cách Model đại diện cho dữ liệu và cách nó tương tác với database, việc xây dựng các chức năng CRUD, Relationship hay API trong Laravel sẽ trở nên dễ hiểu hơn.

Nếu muốn tiếp tục đào sâu cách Laravel tổ chức và xử lý dữ liệu, bạn có thể tham khảo thêm các chủ đề liên quan trên Học Laravel.

Để lại một bình luận

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 *