Laravel Eloquent ORM phần 1: Thao tác với database
ORM là gì?
ORM (Object Relational Mapping) là một kỹ thuật lập trình dùng để chuyển đổi dữ liệu giữa một hệ thống không hướng đối tượng như cơ sở dữ liệu sang hệ thống hướng đối tượng như lập trình hướng đôi tượng trong PHP. Kỹ thuật này tạo ra các đối tượng CSDL ảo có thể được lập trình trong mã nguồn và có nhiều ưu điểm như mã nguồn trở lên rõ ràng và dễ bảo trì, dễ dàng thao tác với dữ liệu và thực hiện việc tối ưu hệ thống thông qua việc sử dụng bộ đệm… Các công việc khó hoặc không thể xử lý ở database layer sẽ được đưa lên lớp ứng dụng.

Thao tác với Model
Tạo Model
Trong Laravel thông qua ORM mỗi bảng trong cơ sở dữ liệu sẽ là một Model, các hành động tương tác với CSDL sẽ được làm trên Model như truy vấn dữ liệu hay insert các bản ghi vào bảng… Các Model có thể được tạo ra thủ công bằng cách tạo file có phần mở rộng php hoặc tự động thông qua các câu lệnh artisan:
Khi đó nó sẽ tạo ra một lớp Product trong file Product.php nằm trong thư mục App\Model

Tạo Model cùng với file migrate
Một vấn đề đặt ra là khi bạn tạo Model nhưng bảng trong cơ sở dữ liệu chưa tồn tại thì sao? Ok, chúng ta sẽ phải thực hiện tạo một bảng mới thông qua Laravel Migration, Laravel cũng hỗ trợ bạn một cách tự động luôn là tạo Model kèm với file migrate luôn thông qua việc thêm tham số –migrate hoặc -m trong câu lệnh tạo Model:
Thao tác với Database
Lấy tất cả bản ghi trong 1 table
Để lấy tất cả các bản ghi trong 1 table chúng ta dùng all()
:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Model\Post; use Session; class PostController extends Controller { public function index() { $data=Post::all(); dd($data); }
Thêm rằng buộc cho câu truy vấn
Có những trường hợp mà chúng ta không cần thiết lấy tất cả các record của table ra, nó làm hiệu năng chương trình của chúng ta kém. Nên thêm những rằng buộc cho câu truy vấn là rất quan trọng để giảm bớt query không cần thiết và tăng hiệu năng chương trình.
$post = Post::where('published', true) ->orderBy('title', DESC) ->take(5) ->get();
Insert
Để tạo một bản ghi mới trong table, thì chúng ta sẽ tạo một model instance, sau đó chúng ta set giá trị của thuộc tính, sau đó dùng phương thức save()
.
public function store(Request $request) { $post = new Post; $post->title = $request->title; $post->content = $request->content; $post->save(); Session::flash('success', 'Bạn tạo bài post thành công'); return redirect()->route('posts.index') }
-Lấy ra một dòng dữ liệu thông qua khóa chính.
$data=Post::find(2) ;//lấy ra bài post có id = 2
Updates
Hàm save() cũng được dùng để cập nhật model đã tồn tại trong database, dầu tiên bạn cần lấy model instance ra trước, bạn thay đổi các thuốc tính trong model instance, rồi gọi hàm save(). Giá trị hàm updated_at sẽ tự động được cập nhật, bạn không cần thay đổi thủ công giá trị này
public function update(Request $request, $id) { $post = Post::find($id); $post->title = "Title bài viết thứ 2"; $post->save(); return redirect()->route('posts.index') }
Delete
Ta tìm bản ghi theo ID và gọi đến phương thức delete()
public function destroy($id) { Post::findOrFail($id)->delete(); return redirect()->route('posts.index') }
Collections
Vì các hàm của Eloquent như all và get đều trả về nhiều kết quả, hay đó là một instance từ Illuminate\Database\Eloquent\Collection sẽ được trả về. Class collection cũng cấp các hàm hữu ích để làm việc với các kết quả Eloquent trả về. Các bạn có thể tham khảo các collection ở đây. Mình sẽ lấy một ví dụ về cách sử dụng collections nhé.
$posts = Post::all(); $posts = $posts->reject(function ($post) { return $post->publish; }); //Giải thích: câu lệnh trên mang ý nghĩa lấy ra tất cả các bài post chưa publish
Chunk
Nếu bạn muỗn xử lý hàng ngán kết quả từ Eloquent, sử dụng chunk
sẽ tiết kiệm được memory khi thao tác với tập dữ liệu kết quả lớn. hàm này sẽ lấy từng chunk
của Eloquent models, cung cấp chúng thông qua Closure
để xử lý.
Post::chunk(200, function ($posts) { foreach ($posts as $post) { echo $post->title. "<br>"; } echo "Hết một chunk"; });
Đếm dữ liệu.
$sum = Post::all()->count();//lấy tổng số bản ghi trong Model
Sắp xếp
Sắp xếp tăng dần(bé ->lớn), mặc định ORDER BY tên-cột ASC,
Sắp xếp giảm dần(từ lớn->bé). ORDER BY tên-cột DESC, …
VD…Lấy ra danh sách sản phẩm sắp xếp theo ID giảm dần?
Đề bài khá là easy phải không đơn giản là vào PostController viết một hàm
public function getPost() { $posts = Post::orderBy('id', 'desc')->get(); return view('post.index', compact('posts')); }
Kết luận
Phần 1 dừng ở đây nhé,các bạn cùng chờ đón về phần tiếp theo nhá