Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Apps
Code

Sử dụng Cơ sở Dữ liệu Illuminate Với Eloquent trong Ứng dụng PHP của Bạn Mà Không cần Laravel

by
Difficulty:IntermediateLength:LongLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Illuminate là hệ thống cơ sở dữ liệu của Laravel trừ Laravel ra. Nó đi kèm với Eloquent ORM trong Laravel. Nếu bạn muốn xây dựng các ứng dụng PHP bằng ORM và không muốn sử dụng Laravel, thì hướng dẫn này là dành cho bạn.

Trong hướng dẫn này, chúng ta sẽ xây dựng back-end cho một ứng dụng Q&A với PHP, Cơ sở dữ liệu Illuminate, và Eloquent ORM.

Các Phụ thuộc của Dự án

  1. PHP: 5.5+
  2. MYSQL
  3. Composer

Khả năng của Ứng dụng

Ứng dụng của chúng ta sẽ thực hiện 10 tác vụ:

  • Thêm người dùng.
  • Thêm câu hỏi.
  • Thêm câu trả lời cho câu hỏi.
  • Upvote (đồng thuận) cho một câu trả lời.
  • Truy vấn một câu hỏi cùng với câu trả lời.
  • Truy vấn tất cả các câu hỏi và những người dùng đã hỏi chúng.
  • Truy vấn các câu hỏi, câu trả lời và các upvote cụ thể.
  • Đếm số câu hỏi của một người dùng cụ thể.
  • Cập nhật câu trả lời của người dùng.
  • Xóa một câu hỏi.

Trước tiên, chúng ta tạo thư mục và cấu trúc dự án của chúng ta.

Trong thư mục chính của dự án, chúng ta sẽ tạo một thư mục app, sau đó trong thư mục app này, chúng ta sẽ tạo hai thư mục: modelscontrollers. Trong hình minh hoạ này, thư mục dự án chính của chúng ta được đặt tên là eloquent. Bạn nên thay thế nó bằng bất cứ cái tên nào bạn thích.

Our project organization

Tiếp theo, chúng ta tạo một tập tin index.php trong thư mục chính của dự án, ở cùng cấp với thư mục app.

Chúng ta sẽ sử dụng git, vì vậy chúng ta tạo một tập tin .gitignore. Lưu ý rằng bước này là không bắt buộc.

Tiếp theo, chúng ta tiến hành cài đặt các phụ thuộc cần thiết cho dự án này để nó hoạt động. Trong thư mục chính của dự án, chúng ta sẽ tạo một tập tin composer.json. Sau đó, dán đoạn code này vào tập tin composer.json của chúng ta.

Để cài đặt cơ sở dữ liệu Illuminate, chúng ta thêm điều này vào composer.json của chúng ta:
“illuminate/database”: “5.1.8”,.

Tiếp theo, chúng ta thêm autoloading psr-4 cho các Model và Controller của chúng ta:

Bây giờ, tập tin composer.json của chúng ta sẽ như sau:

Bây giờ chúng ta sẽ chạy hai lệnh của composer ở cùng vị trí với tập tin composer.json của chúng ta:

Thao tác này sẽ tạo ra thư mục vendor mà chúng ta có thể thêm vào gitignore (đây cũng là bước không bắt buộc).

Hãy thêm một tập tin cấu hình cho các chứng chỉ cơ sở dữ liệu của chúng ta.

Trong thư mục chính của dự án, chúng ta tạo một tập tin có tên là config.php và định nghĩa các chi tiết Cơ sở Dữa liệu trong tập tin Config.php. Lưu ý rằng các giá trị nên được thay thế bằng các chi tiết kết nối của riêng bạn.

Tiếp theo, chúng ta tạo ra lược đồ cho ứng dụng của chúng ta.

Một điều cần lưu ý trước khi tạo lược đồ cho các bảng trong cơ sở dữ liệu của chúng ta là chúng ta có thể thêm timestamp (mốc thời gian) vào lược đồ của chúng ta.

Eloquent ORM kỳ vọng hai cột timestamp nếu chúng ta muốn kích hoạt hoạt động timestamp trên một bảng/model cụ thể. Chúng là các cột created_atupdated_at. Nếu chúng ta kích hoạt timestamp cho một model, thì Eloquent sẽ tự động cập nhật các trường này bằng thời gian khi chúng ta tạo hoặc cập nhật một bản ghi.

Có một cột thứ ba được gọi là deleted_at. Timestamp deleted_at hoạt động theo cách khác. Eloquent có khả năng xóa mềm, nó sử dụng cột deleted_at để xác định liệu một bản ghi đã bị xóa hay chưa. Nếu bạn xóa một bản ghi bằng hàm 'delete' của eloquent và bạn kích hoạt Xóa Mềm, thì cột được cập nhật với thời gian xóa. Những mục đã xoá này sau đó có thể được truy vấn bất cứ lúc nào.

Trong ứng dụng này, chúng ta sẽ tận dụng timestamp, vì vậy chúng ta sẽ sử dụng cả ba trong Lược đồ của chúng ta.

Tạo các bảng với các lệnh sau trong MySQL:

Bảng Questions

Answers (bảng câu trả lời)

Bảng Upvotes

Bảng Users

Chúng ta sẽ tiếp tục bằng cách tạo các tập tin cho các model và controller cho các bảng của chúng ta ở các vị trí sau:

  • project_folder/app/models/question.php
  • project_folder/app/models/answer.php
  • project_folder/app/models/upvote.php
  • project_folder/app/models/user.php
  • project_folder/app/models/database.php
  • project_folder/app/controllers/questions.php
  • project_folder/app/controllers/answers.php
  • project_folder/app/controllers/upvotes.php
  • project_folder/app/controllers/users.php

Mở models/database.php trong một trình soạn thảo.

Đầu tiên chúng ta tạo ra Capsule:

Trong tập tin ở trên, chúng ta khởi tạo và thiết lập capsule với các hằng số được định nghĩa trong config.php, và sau đó chúng ta khởi động eloquent.

Bước tiếp theo là tạo một script khởi động. Đây sẽ là một tập tin nơi mọi thứ phải được chạy trước khi các công việc của ứng dụng được chạy.

Chúng ta tạo một tập tin khởi động trong vị trí project_folder/start.php, và sau đó trong tập tin, require (yêu cầu) tập tin autoload của Composer:

require ‘vendor/autoload.php’;

Sau đó, chúng ta require config.php để lấy các chứng chỉ được định nghĩa: require 'config.php';

Sau đó chúng ta khởi tạo lớp Database.

Tập tin start.php của bạn sẽ giống như sau:

Bao gồm start.php trong index.php của bạn vì đây sẽ là tập tin chính của chúng ta.

Tập tin index.php của chúng ta giờ đây sẽ như sau:

Tiếp theo, chúng ta có thể bắt đầu làm việc với các controller và model của chúng ta. Trong project_folder/app/models/question.php, chúng ta thêm điều này:

Sau đó trong project_folder/app/controllers/questions.php:

Trong project_folder/app/controllers/answers.php, chúng ta thực hiện tương tự:

Tác vụ 1: Thêm Người dùng

Trong model user (project_folder/app/models/user.php), chúng ta thêm đoạn code sau để định nghĩa không gian tên của chúng ta, thừa kế Model của Eloquent, và định nghĩa tên bảng (protected $table) và những trường nào trong bảng có thể được điền bằng cách tạo hàng loạt (protected $fillable).

Trong controller user (project_folder/app/controllers/user.php), chúng ta định nghĩa không gian tên và lớp của chúng ta như bình thường:

Sau đó, để tạo một người dùng, trong controller user, chúng ta import (nhập) không gian tên của Model user, sử dụng Models\User;, và sau đó thêm một hàm để tạo người dùng.

Controller user của chúng ta bây giờ trông như thế này.

Sau đó trong index.php chúng ta thêm các dòng này và chạy ứng dụng để tạo ra một người dùng mới.

Tác vụ 2: Thêm một Câu hỏi

Để thêm một câu hỏi chúng ta import không gian tên model Question trong controller question, và viết một hàm create_question:

use Models\Question;

Sau đó:

Chúng ta đã sử dụng các model tạo hàng loạt của Eloquent để chèn bản ghi này, nhưng trước khi nó hoạt động, chúng ta cần cho phép các trường đó có thể được điền vào, bởi vì các model của Eloquent mặc định bảo vệ khỏi việc tạo hàng loạt.

Vì vậy, chúng ta vào model question và thêm thuộc tính $fillable vào lớp.

protected $fillable = ['question','user_id'];

Để chạy điều này, hãy import controller question trong index.php và gọi hàm tĩnh create_question:

use Controllers\Question;

Sau đó, tạo một question với một câu hỏi và User Id làm tham số:

$question = Questions::create_question("Bạn đã bao giờ gặp con ma sống chưa?",1);

Điều này trả về một đối tượng model nếu thành công.

Bây giờ chúng ta sẽ chạy script index.php với các mục khác nhau để thêm câu hỏi vào cơ sở dữ liệu.

Tác vụ 3: Thêm Câu trả lời vào Câu hỏi

Trong model answer, chúng ta lặp lại các bước thực hiện cho các model question và user bằng cách thêm code dưới đây:

Sau đó, trong controller answers, chúng ta viết các dòng code sau:

Sau đó, trong index.php, chúng ta có thể tạo một câu trả lời cho câu hỏi với id 1 mà chúng ta đã thêm trước đó, với user id 2. Đừng quên import controller answers vào index.php trước.

Để tránh nhiều mục, hãy comment tất cả các cuộc gọi khác trong index.php trước khi chạy một cái mới.

Tác vụ 4: Upvote một Câu trả lời

Điều này khá giống các bước mà chúng ta thường làm.

Vì vậy, chúng ta sẽ bắt chước điều này vào model Upvote tại project_folder/app/models/upvote.php.

Sau đó, trong controller answers, chúng ta import không gian tên Model Upvote.

use Models\Upvote;

Sau đó chúng ta tạo ra một hàm upvote_answer.

Trong index.php, chúng ta có thể gọi hàm này bằng một User ID giả để cập nhật câu trả lời với id 1.

$upvote = Answers::upvote_answer(1,14);

Tác vụ 5: Truy vấn một Câu hỏi Với các Câu trả lời

Đối với các tác vụ như thế này, chúng ta có thể sử dụng các quan hệ của Eloquent.

Các kiểu quan hệ bao gồm một-một, một-nhiều, nhiều-nhiều, v.v...

Khi sử dụng các quan hệ này, thì Eloquent giả định một khoá ngoài trong hình thức modelname_id tồn tại trong các model. Đối với tác vụ này, quan hệ là một-nhiều vì một câu hỏi duy nhất có thể sở hữu bất kỳ số lượng câu trả lời.

Đầu tiên chúng ta định nghĩa quan hệ này bằng cách thêm hàm này vào model question của chúng ta.

Sau đó, trong controller questions, chúng ta viết một hàm để lấy câu hỏi cùng với các câu trả lời.

Điều này truy vấn các câu hỏi cùng với các câu trả lời tương ứng của chúng.

Trong index.php, chúng ta comment tất cả các cuộc gọi khác và chạy:

$all = Questions::get_questions_with_answers();

Chúng ta có thể gọi var_dump hoặc print_r biến $all để xem kết quả.

Tác vụ 6: Truy vấn Tất cả các Câu hỏi và Người dùng đã Hỏi Chúng

Đây là quan hệ một-một vì một câu hỏi chỉ có một người dùng, vì vậy chúng ta thêm điều này vào model question.

Sau đó, chúng ta tạo ra một hàm trong controller questions và sử dụng hàm with trên model question.

Trong index.php, comment tất cả những cái khác và chạy lệnh này:

$all_with_users = Questions::get_questions_with_users();

Tác vụ 7: Truy vấn Một Câu hỏi Với các Câu trả lời và Upvote

Trước tiên, chúng ta xác định một quan hệ giữa các câu trả lời và upvote. Một câu trả lời có nhiều upvote, vì vậy mối quan hệ là một-nhiều.

Vì vậy, chúng ta thêm hàm sau đây vào model answer của chúng ta:

Sau đó, trong controller questions, chúng ta tạo ra hàm để truy vấn điều này:

Như trong các bước trước, chúng ta comment tất cả các cuộc gọi khác đến index.php và chạy lệnh này:

$one_question = Questions::get_question_answers_upvotes(1);

Chúng ta có thể in ra biến $one_question để xem kết quả.

Tác vụ 8: Đếm Tất cả các Câu hỏi của một Người dùng Cụ thể

Đầu tiên chúng ta import model question vào controllers users:

use Models\Question;

Sau đó chúng ta viết hàm này:

Trong index.php, chúng ta comment các cuộc gọi khác và thêm dòng này:

$user_question_count = Users::question_count(1);

Điều này trả về một số nguyên là số câu hỏi đã được thêm vào bởi một người dùng có id 1.

Chúng ta có thể in ra biến $user_question_count và chạy index.php để xem kết quả.

Tác vụ 9: Cập nhật Câu trả lời bởi Người dùng

Khái niệm cập nhật với Eloquent ORM là khá đơn giản. Đầu tiên chúng ta tìm một bản ghi, và sau đó chúng ta thay đổi và lưu lại.

Bây giờ, controller answers, chúng ta thêm hàm này:

Trong index.php, chúng ta có thể comment tất cả các cuộc gọi khác, và cập nhật câu trả lời có id 1 như sau:

$update_answer = Answers::update_answer(1,”Đây là một câu trả lời đã được cập nhật”);

Điều này trả về một giá trị boolean—true—nếu việc cập nhật thành công.

Tác vụ 10: Xóa Câu hỏi (Xóa mềm)

Trong tác vụ cuối cùng này, chúng ta sẽ cài đặt SoftDelete của Eloquent.

Đầu tiên, chúng ta sẽ nói với model question sử dụng SoftDeletes bằng cách import không gian tên SoftDeletes, và sau đó sử dụng đặc tính SoftDeletes trong lớp của chúng ta.

use Illuminate\Database\Eloquent\SoftDeletes;

Sau đó, sau dòng khai báo lớp, chúng ta thêm dòng này:

use SoftDeletes;

Sau đó, chúng ta thêm deleted_at vào thuộc tính protected $dates cho model. Đây là những bước bắt buộc.

protected $dates = [‘deleted_at’];

Model question của chúng ta bây giờ trông như sau:

Sau đó chúng ta tạo hàm delete_question trong controller questions.

Chạy trong index.php:

$delete = Questions::delete_question(1);

Xin chúc mừng! Bạn vừa mới xây dựng xong một back-end đầy đủ chức năng với Illuminate và Eloquent. Và chúng ta không cần phải viết quá nhiều code để có được tất cả những điều này.

Code cho hướng dẫn này có thể được tìm thấy trên GitHub.

Tóm tắt

Illuminate còn đi kèm với Query Builder cái mà bạn có thể sử dụng cho các truy vấn cơ sở dữ liệu phức tạp hơn và chắc chắn là một điều gì đó mà bạn muốn thử nghiệm và sử dụng trong ứng dụng của bạn.

Điều duy nhất còn thiếu trong cơ sở dữ liệu Illuminate độc ​​lập đó là di trú (migration) cơ sở dữ liệu, đó là tính năng đáng yêu của Laravel và Lumen, microframework của Laravel. Bạn nên cân nhắc việc sử dụng cả hai trong ứng dụng của bạn để tận dụng các tính năng hữu ích mà chúng có.

Bạn có thể tìm hiểu thêm về Eloquent trên trang Tài liệu Hướng dẫn Chính thức của Eloquent.

Tham khảo

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.