Laravel 09: C và R với Eloquent Models

Ở bài trước, tôi đã giới thiệu về database migrations, qua đó bạn tạo database với Laravel. Và bây giờ, chúng ta sẽ tiến hành createread. Trước hết, bạn sẽ tạo một PostModel với câu lệnh:

Laravel sẽ tạo cho chúng ta một tập tin Post.php nằm trong app/Http. Nội dung của tập tin này không có gì đặc biệt ngoài việc Post extends Model:

Và thực sự chúng ta cũng không định nghĩa gì thêm ở đây. Thực chất, mọi “phép màu” đều nằm trong base class Eloquent/Model, vì vậy, ta không cần định nghĩa thêm biến hay hàm trong Post class. Bây giờ, bạn quay lại web.php để kiểm tra lại các posts route của chúng ta:

Bây giờ, bạn điều chỉnh view posts.blade.php theo nội dung bên dưới. Tôi sẽ hướng dẫn các bạn createread database cùng một lúc ngay trên posts view, vì vậy, chúng sẽ có một form để thêm bài viết gồm 4 text inputs tương ứng title, content, authorcategory vốn chính là các cột được tạo trong database laravel/posts của bài trước, bên dưới là danh sách các posts. Sau khi thêm một post, bạn sẽ thấy nó xuất hiện ngay trong danh sách.

Câu hỏi được đặt ra là $posts ở đâu mà có? Nếu bạn đang nghĩ tới PostController, thì bạn đã đi đúng hướng. Bạn tiến hành sửa các hàm indexstore của PostController.php theo nội dung bên dưới:

Bây giờ, tôi sẽ giải thích code. Đầu tiên, chúng ta sẽ tiến hành đọc dữ liệu từ database thông qua Post model, mặc dù class Post của chúng ta không có bất kì một methods hay fields nào, nhưng nhờ việc extends Model, Post sẽ thừa hưởng các methods từ Model. Chẳng hạn, chúng ta có Post::latest()->get() sẽ tiến hành đọc và trả về tất cả các dòng của posts table trong laravel database được migrate trong bài trước. Tuy nhiên, có lẽ bạn sẽ thắc mắc vì sao Post model lại “tự dưng biết” mà tìm đến ‘posts’ table? Câu trả lời khá đơn giản. Khi được tạo xong, Eloquent model mặc định sẽ tự biết tìm tới tên table dựa trên tên của nó, dưới dạng số nhiều trong tiếng Anh. Chẳng hạn, chúng ta có Posttable sẽ là ‘posts’. Nếu model là Category, nó sẽ trỏ tới table ‘categories’, nếu model là Tooth, nó sẽ trỏ tới table ‘teeth’ theo mặc định. Vì vậy, chí ít bạn nên có kiến thức về danh từ số nhiều trong tiếng Anh.

Tuy nhiên, không phải lúc nào Model cũng phải trỏ tới table có tên tương ứng. Chẳng hạn, model là Tooth nhưng phải trỏ tới thư mục ‘wiped_teeth’. Lúc này, bạn chỉ cần chỉ định biến $table (tương tự như override – đây là kiến thức PHP đối tượng cơ bản) là được. Ví dụ:

Trở lại với Post‘posts’ table. Hàm Post::latest()->get() sẽ trả về cho chúng ta một array chứa tất cả các dòng được đọc từ ‘posts’ table. Tiếp theo, bạn chỉ cần output chúng ra ‘posts’ view theo kiến thức đã học về routesviews trong bài 02 là được. Một vấn đề khác xuất hiện là trong Post không có bất kì định nghĩa nào về các biến $title, $content, $author$category, nhưng chúng ta có thể gán và đọc được. Đó chính là điều kì diệu của Laravel: Các props sẽ được tạo tự động dựa trên tên cột. Bạn chỉ cần make:model với một class (gần như) rỗng và Laravel sẽ lo các phần còn lại. Rất thuận tiện và tuyệt vời.

Nhưng hiện tại, $posts của chúng ta đang rỗng vì ‘posts’ table của chúng ta hiện đang không có gì. Tất nhiên, bạn có thể thêm một số dữ liệu giả qua phpmyadmin để test. Tuy nhiên, sẽ nhanh hơn nếu chúng ta tạo một post mới thông qua form đã được tạo. Và điều này sẽ invoke tới PostController@store. Nhìn lại nội dung của store, bạn sẽ thấy không có gì phức tạp. Ma thuật diễn ra ở hàm $post->save(), và bạn hiện cũng không cần quan tâm tới save hoạt động như thế nào, chỉ đơn giản cần biết save sẽ… save mà thôi. Hãy cho chạy thử và kết quả sẽ là rất tuyệt vời. 👌👌👌

Như vậy, chúng ta đã xong CR trong 4 thao tác cơ bản của CRUD. Tuy nhiên, chúng ta có một phần chưa được xử lí là link của a để view post tương ứng với id. Sang bài sau, tôi sẽ hướng dẫn các bạn xử lí với nó, cũng như các thao tác UD.

Leave a Reply

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.