Model

Bài học này chúng ta sẽ tìm hiểu phần còn lại trong cấu trúc Model-View-Controller là Model.

Trong lập trình web, việc phát triển các chức năng giúp tạo mới, chỉnh sửa, truy xuất và xóa dữ liệu là khá phổ biến. Các chức năng này yêu cầu ứng dụng của chúng ta phải tương tác với CSDL. Trong cấu trúc MVC Model được sử dụng để tách biệt quy trình tương tác với CSDL với các quy trình khác như kiểm soát luồng đi của ứng dụng hay sắp xếp, trình bày thông tin trước khi gửi về trình duyệt. Trong Laravel, mỗi một Model là một Class tương ứng một bảng trên CSDL và Class này sẽ có những thuộc tính và phương thức giúp tương tác với CSDL.

Tạo User Model

Bây giờ, bạn hãy thay đổi nội dung của file User.php bên trong thư mục app/models thành như sau:

<?php
class User extends Eloquent {
    protected $table = 'users';

    protected $timestamps = false;
}

Class Eloquent được dùng để tạo một Model với những thuộc tính và method được định nghĩa sẵn. Ở đây thuộc tính $table được dùng để giúp xác định xem class User sẽ được gắn với bảng nào trên CSDL. Thuộc tính thứ 2 $timestamps được dùng để xác định xem 2 cột created_atupdated_at có tồn tại trên bảng users hay không. Hai cột này dùng thường được thêm vào để theo dõi khi nào một record được thêm vào bảng hay cập nhật trên bảng. Trường hợp của chúng ta không sử dụng 2 cột này nên giá trị của thuộc tính này sẽ là false.

Bây giờ, trong file routes.php bạn thêm đoạn mã sau:

Route::get('/users/', function ()
{
    $users = User::all();
    $numberOfUsers = count($users);
    dd($numberOfUsers);
});

Ở đoạn mã trên chúng ta gọi method tĩnh all của class User. Method này sẽ trả về danh sách tất cả các record lấy từ bảng users trên CSDL. Giá trị của biến users lúc này sẽ là một đối tượng của class Collection. Class Collection trong Laravel Framework được dùng để làm việc với một tập hợp kết quả trả về từ Eloquent. Chúng ta dùng hàm count trên đối tượng của tạo ra từ class Collection để đếm các record trả về. Khi truy cập vào địa chỉ /users bạn sẽ thấy kết quả như sau:

Laravel Eloquent

Hiện tại trên bảng users chúng ta chưa có bất cứ một record nào nên kết quả trả về là 0 record.

Chèn Record Vào Bảng

Để chèn record vào bảng users, chúng ta cần tạo một object mới từ class User sau đó sử dụng method save. Trong file routes.php bạn thêm vào đoạn mã như dưới đây:

Route::get('/users/create', function () {
    $user = new User;
    $user->firstname= 'Sơn';
    $user->lastname= 'Tùng';
    $user->username = 'sontungmtp';
    $user->password = 'emcuangayhomqua';
    $user->save();
});

Đồng thời comment dòng route khai báo cho URL có dạng /{username}/{password} để tránh việc route chúng ta mới tạo ra /users/create sẽ không được sử dụng do định dạng của nó là tập hợp con của định dạng /{username}/{password}:

// Route::get('/{username}/{password}', '[email protected]');

Tiếp theo bạn nhập vào địa chỉ URL /users/create trên trình duyệt và bấm Enter. Trình duyệt sẽ hiển thị một màn hình trống do chúng ta không trả về một View nào. Tuy nhiên khi chạy câu lệnh sau sử dụng MySQL Client:

select * from users;

Bạn sẽ thấy kết quả trả về như sau:

Laravel Eloquent

Tìm và Đọc Dữ Liệu

Để tìm dữ liệu từ bảng sử dụng khóa chính id chúng ta sử dụng method find. Thêm đoạn mã sau vào phía dưới file routes.php:

Route::get('/users/{id}', function ($id)
{
    $user = User::find($id);
    return $user->username;
});

Khi bạn truy cập địa chỉ /users/1, trình duyệt sẽ hiển thị tên đăng nhập username của người dùng với id được lưu trên database với giá trị là 1. Trong trường hợp của chúng ta username này chính là record mới được thêm vào:

Laravel Eloquent

Ngoài ra, sử dụng Eloquent bạn cũng có thể tìm kiếm một hoặc nhiều record theo giá trị của một trường ví dụ sau đây cũng trả về kết quả giống như trên:

Route::get('/users/{id}', function ($id)
{
    $builder = User::where('username', '=', 'sontungmtp');
 $users = $builder->get();
    return $users[0]->username;
});

Ở đây chúng ta sử dụng method where để truy vấn CSDL cho các record với cột username có giá trị là sontungmtp. Method này sẽ trả về một đối tượng của class Builder, class này dùng để hỗ trợ truy vấn CSDL.

$builder = User::where('username', '=', 'sontungmtp');

Tuy nhiên, để đọc kết quả trả về từ database được dễ dàng hơn chúng ta cần gọi method get từ object builder trả về. Method này sẽ trả về đối tượng của class Collection từ dữ liệu của object builder.

$builder = User::where('username', '=', 'sontungmtp');
$users = $builder->get();

Do chúng ta chỉ có một record trên CSDL nên object users nhận được sẽ chỉ có một phần tử và chúng ta sẽ truy cập vào phần tử này sử dụng khóa với giá trị là 0:

return $users[0]->username;

Cuối cùng, bạn có thể sử dụng việc nối các method lại với nhau để giúp mã lệnh gọn gàng hơn như sau:

Route::get('/users/{id}', function ($id)
{
    $users = User::where('username', '=', 'sontungmtp')->get();
    return $users[0]->username;
});

Cập Nhật Dữ Liệu

Để cập nhật dữ liệu, chúng ta cần thực hiện 3 giai đoạn. Đầu tiên, chúng ta cần tìm xem record nào trên CSDL sẽ được cập nhật, ở đây chúng ta sử dụng method find:

$user = User::find(1);

Sau đó chúng ta cập nhật record tìm được bằng câu lệnh gán giá trị mới:

    $user->username= 'tungmtp2015';

Cuối cùng chúng ta gọi method save để lưu sự thay đổi:

$user->save();

Bây giờ, bạn thêm đoạn mã sau vào cuối file routes.php:

Route::get('/users/{id}/update', function ($id)
{
    $user = User::find(1);
    $user->username= 'tungmtp2015';
    $user->save();
    $newuser = User::find(1);
    return $newuser->username;
});

Khi truy cập vào địa chỉ /users/1/update bạn sẽ thấy kết quả hiển thị giá trị cho username của record với id bằng 1 đã được thay đổi: Laravel Eloquent

Xóa Dữ Liệu

Việc xóa dữ liệu được thực hiện nhờ sử dụng method delete trong Eloquent, thêm đoạn mã sau vào phía cuối file routes.php:

Route::get('/users/{id}/delete', function ($id)
{
    $user = User::find(1);
    $user->delete();
    $users= User::all();
    return count($users);
});

Sau đó truy cập vào địa chỉ /users/1/delete bạn sẽ thây kết quả như sau:

Eloquent xóa dữ liệu