Laravel Eloquent ORM phần 1: Thao tác với database

0

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:

php artisan make:model Product

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:

php artisan make:model Product –migration
php artisan make:model Product -m

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á

Leave A Reply

Your email address will not be published.