Kubet

  • Thabet
  • Dàn đề
  • Kubet
  • Lô Đề

Bài 8: Thao tác với Database qua Eloquent Model

Đăng bởi : Admin | Lượt xem : 3499 | Chuyên mục : Laravel

1. ORM là gì?

ORM ( Object Relational Mapping ) là một kĩ thuật lập trình dùng để quy đổi tài liệu giữa một mạng lưới hệ thống không hướng đối tượng người dùng như cơ sở tài liệu sang một mạng lưới hệ thống hướng đối tượng người dùng như lập trình hướng dối tượng trong PHP. Kỹ thuật này tạo ra những đối tượng người tiêu dùng CSDL ảo hoàn toàn 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 dưỡng, thuận tiện thao tác với tài liệu và triển khai việc tối ưu mạng lưới hệ thống trải qua việc sử dụng bộ đệm … Các việc làm khó hoặc không hề giải quyết và xử lý ở database layer sẽ được đưa lên lớp ứng dụng

2. Eloquent Model

Eloquent ORM là thư viện ORM được cài đặt kèm với Laravel, cung cấp loạt các phương thức truy xuất dữ liệu đơn giản, dễ triển khai. Mỗi bảng dữ liệu đều được mô tả thành một “model” trong Laravel và Eloquent ORM ánh xạ các dữ liệu này thành các đối tượng Active Record tương ứng với “model” đó, từ đó làm việc với dữ liệu trở nên đơn giản hơn với thao tác chính từ các “model” này

Bạn đang đọc: Bài 8: Thao tác với Database qua Eloquent Model

Với mỗi một Model tất cả chúng ta sẽ có 4 hành vi mà tất cả chúng ta chăm sóc, nó tương ứng với 4 hành vi với những bản ghi dữ liệu ( record ) :

  1. Create: tạo ra một Model, tương ứng với việc tạo ra một bản ghi dữ liệu trong bảng.
  2. Read: truy vấn dữ liệu từ database và map lên Model
  3. Update: chỉnh sửa một Model hay tương ứng là chỉnh sửa một bản ghi.
  4. Delete: xóa một Model và tương ứng là xóa một bản ghi dữ liệu.

3. Insert dữ liệu

Tạo một bảng ghi dữ liệu

Như đã nói ở trên, việc thêm một bản ghi tài liệu sẽ tương ứng với tạo một thực thể hay một setup ( instance ) từ Model .

Tạo một thực thể bằng câu lệnh new Ten_model, ở đây tạo ra một thực thể là USD product từ Model Product, sau đó gán giá trị cho những thuộc tính của chúng. Khi muốn lưu record này vào database tất cả chúng ta gọi đến phương pháp save ( ). Chú ý, những trường created_at, updated_at sẽ được update những giá trị thời hạn một cách tự động hóa do đó bạn chỉ cần chăm sóc đến những trường này khi sử dụng giá trị của chúng .Chúng ta cùng xem lại nếu như không sử dụng Laravel Eloquent tất cả chúng ta cũng hoàn toàn có thể sử dụng Query Builder để thực thi, và khi đó tất cả chúng ta phải tự chủ động giải quyết và xử lý những việc làm mà Laravel Eloquent đã ngầm định như đưa vào giá trị thời hạn cho created_at, updated_at ví dụ điển hình .

// Code trích dẫn trong phương thức store của ProductController trong ví dụ Query Builder
$active = $request-&gthas('active')? 1 : 0;
    $product_id = DB::table('products')-&gtinsertGetId([
        'name'       => $request-&gtinput('name'),
        'price'      => $request-&gtinput('price'),
        'content'    => $request-&gtinput('content'),
        'image_path' => $request-&gtinput('image_path'),
        'active'     => $active,
        'created_at' => \Carbon\Carbon::now(),
        'updated_at' => \Carbon\Carbon::now()
        ]);

Model Mass Assignment

Mass Assignment là gì ? Mass Assignment xuất phát từ ngôn từ Ruby on Rails, là tính năng được cho phép lập trình một cách tự động hóa gán những tham số của một HTTP request vào những biến hoặc đối tượng người tiêu dùng trong lập trình. Ví dụ : tất cả chúng ta có một form ĐK người dùng như sau, những tên trường nhập liệu trùng với tên cột trong bảng users trong CSDL .

&ltform>
     &ltinput name='username' type='text'>
     &ltinput name='password' type='text'>
     &ltinput name='email' type='text'>
     &ltinput type=submit>
  

Khi đó form này POST dữ liệu lên tất cả chúng ta hoàn toàn có thể ghi tài liệu này vào CSDL bằng đoạn code sau :

$user = new User(Input::all());

Thật ngắn gọn và đơn thuần đúng không, tính năng này gọi là Mass Assignment. Tuy nhiên, có một lỗ hổng bảo mật thông tin xảy ra, nếu một kẻ xấu gửi thêm tài liệu user_type = ‘ admin ’, khi đó user mới được tạo sẽ có quyền admin, việc gắn thêm tài liệu gửi lên server là rất đơn thuần hoàn toàn có thể thực thi bằng những công cụ có sẵn trên trình duyệt như Chrome Developer Tools …Để giải quyết và xử lý yếu tố lỗ hổng trong Mass Assignment, Laravel đưa ra thêm hai thuộc tính cho Model là USD fillable và USD guarded. Ví dụ :

USD fillable được cho phép thiết lập những cột trong một bảng hoàn toàn có thể sử dụng tính năng Mass Assignment, khi đó ta hoàn toàn có thể triển khai :

$user = User::create(Input::all());
// Hoặc
$user = new User(Input::al());

Khi đó nếu kẻ xấu gửi thêm user_type là trường không có trong USD fillable, những câu lệnh trên sẽ phát sinh một exception ngay. Như vậy lỗ hổng trong Mass Assignment đã được giải quyết và xử lý .Trái ngược với USD fillable, ta hoàn toàn có thể định nghĩa những trường được bảo vệ khỏi Mass Assignment trải qua thuộc tính USD guarded. Không khai báo cả 2 thuộc tính này đồng thời Chú ý: USD fillable và USD guarded chỉ có tính năng với những phương pháp của Eloquent Model, với những phương pháp của Query Builder nó không có công dụng. Ví dụ sau dẫn chứng cho điều này :

// Phương thức Eloquent 
$user = User::find($id);
$user-&gtupdate(Input::all());

// Phương thức Query Builder
User::where('id', $id)-&gtupdate(Input::all());

Khi đó nếu kẻ xấu có tình chèn thêm user_type = ‘ admin ’ thì đoạn code đầu sẽ phát sinh exception còn đoạn code sau vẫn chạy thông thường .

Một số phương thức tạo bản ghi khác

Có hai phương pháp tạo bản ghi mới sử dụng Mass Assignment khác là firstOrCreate và firstOrNew. Phương thức firstOrCreate ( ) thử tìm những bản ghi sử dụng cặp cột và giá trị, nếu không tìm thấy, một bản ghi sẽ được tạo ra với những thuộc tính này. firstOrNew thì khác chút là nó không ghi tài liệu vào CSDL mà trả về một instance của model, chỉ ghi tài liệu xuống CSDL khi gọi phương pháp save ( ) .

// Tìm user trong CSDL nếu không có thì insert bản ghi
$user = User::firstOrCreate(Input::all());

// Tìm user trong CSDL nếu không có thì trả về một instance của User và chỉ ghi xuống CSDL khi gọi phương thức save()
$user = User::firstOrCreate(Input::all());
$user-&gtsave();

Một phương pháp nữa cũng rất hay gặp trong thực tiễn là updateOrCreate, nó sử dụng để update hoặc tạo mới một entry, ví dụ

$product = Product::updateOrCreate(
    ['name' => 'Bộ phát WiFi TENDA FH304', 'active' => 1],
    ['price' => 750000]
);

Truy vấn dữ liệu bằng Model

Bạn đã tạo ra những record, giờ là lúc đọc những record này và giải quyết và xử lý chúng. Trong database, tất cả chúng ta thường viết những câu truy vấn tài liệu để lấy tài liệu, ở trên lớp trên tất cả chúng ta cũng triển khai những truy vấn trải qua Model. Để lấy tổng thể những record trong table mà Model biểu lộ tương ứng sử dụng phương pháp all ( ) :

Đoạn mã trên lấy toàn bộ những mẫu sản phẩm trong bảng products và duyệt qua những thực thể đó rồi in ra màn hình hiển thị thông tin về loại sản phẩm. Chúng ta hoàn toàn có thể thêm những điều kiện kèm theo vào truy vấn :

', '350000')
		-&gtorderBy('name')
		-&gttake(10)
		-&gtget();

foreach ($products as $p) {
    echo 'Sản phẩm: '. $p-&gtname. ' có giá '. number_format($p-&gtprice). 'VNĐ' ;
}

Các phương pháp sử dụng để thêm điều kiện kèm theo trong truy vấn như where, orderBy, take … bạn hoàn toàn có thể xem thêm trong phần Xây dựng truy vấn database với Laravel Query Builder. Kết quả trả về của những phương pháp get ( ), all ( ) là một instance của lớp Illuminate \ Database \ Eloquent \ Collection. Laravel Collection là một trong những phần cực hay về giải quyết và xử lý tài liệu dạng tập hợp, nó thiết kế xây dựng sẵn hàng trăm những hàm giúp bạn viết code cực nhanh với những nhu yếu tổng hợp tài liệu phức tạp. Ví dụ : bạn muốn tính tổng theo những nhóm thỏa mãn nhu cầu một điều kiện kèm theo trong một tập hợp ví dụ điển hình, chỉ cần 1 dòng code là bạn hoàn toàn có thể thực thi được. Khó tin nhỉ, xem phần Laravel Collection để kiểm chứng nhé. Bạn nào đã từng làm quen với Lodash một thư viện Javascript tuyệt vời cho giải quyết và xử lý những tập hợp thì Laravel Collection cũng tương tự như như vậy .Hơi dài dòng một chút ít vì có nhiều điều cần viết quá nhưng thôi tất cả chúng ta lại tập trung chuyên sâu vào chủ đề của bài viết. Tình huống tiếp theo, tất cả chúng ta muốn tìm một mẫu sản phẩm khi biết id của loại sản phẩm hoặc muốn lấy một loại sản phẩm bất kể có giá 300 k ví dụ điển hình, thuận tiện thực thi với Eloquent Model :

', 300000)-&gtfirst();
echo 'Sản phẩm: '. $product-&gtname. ' có giá '. $product-&gtprice. ' VNĐ';

Chú ý, phương pháp find ( ) hoàn toàn có thể truyền vào một mảng những id của loại sản phẩm

Các truy vấn cũng hoàn toàn có thể đưa vào những hàm tổng hợp tài liệu như với Laravel Query Builder như count ( ), max ( ), min ( ) …

4. Cập nhật dữ liệu

Khi muốn update giá trị cột nào đó trong bảng, cũng đơn thuần là tạo instance của Model tương ứng và sử dụng phương pháp save ( ) như ở trên :

Trên đây chúng ta update một bản ghi, vậy update cùng lúc nhiều bản ghi thì làm thế nào trong Eloquent Model? Ví dụ, tất cả các sản phẩm TENDA hiện đang hết hàng và chúng ta muốn chuyển chúng sang chế độ không đăng bán active = 0, chúng ta thực hiện như sau:

Xem thêm: Cách cài đặt win 10 nhanh nhất cho laptop, PC chỉ với 8 bước đơn giản

Product::where('active', 1)
          -&gtwhere('name', 'like', '%TENDA%')
          -&gtupdate(['active' => 0]);

5. Xóa bản ghi dữ liệu

Xóa bản ghi tài liệu đơn thuần bằng cách gọi phương pháp delete ( ) trên thực thể của Model :

$product = Product::find(1);
$product-&gtdelete();

Hoặc tất cả chúng ta hoàn toàn có thể truy vấn tài liệu và xóa dựa trên tác dụng truy vấn : Xóa toàn bộ những loại sản phẩm đang không active .

$deletedProducts = Product::where('active', 0)-&gtdelete();

Xử lý bản ghi đã xóa

Trước đây, khi dung tích và bộ giải quyết và xử lý trong sever là một cái gì đó xa xỉ, những bản ghi cần được xóa triệt để khỏi cơ sở tài liệu, lúc bấy giờ thì đã khác nhiều, tất cả chúng ta không cần chăm sóc nhiều đến dung tích tàng trữ. Các bản ghi cũng thế cho nên chỉ được xóa mềm ( soft delete ), thực ra là thêm một trường lưu lại là bản ghi này đã xóa. Các tài liệu đã xóa là rất thiết yếu cho việc nghiên cứu và phân tích hành vi người dùng hoặc kiểm tra debug những ứng dụng. Laravel tương hỗ xóa mềm một bản ghi bằng cách thêm một thuộc tính deleted_at vào Model cũng như ở table trong database. Để cho phép một Model hoàn toàn có thể thực thi được lưu lại bản ghi đã xóa, tất cả chúng ta sử dụng trait Illuminate \ Database \ Eloquent \ SoftDeletes và thêm deleted_at vào thuộc tính USD dates của nó :

Khi đó, nếu bạn triển khai phương pháp delete ( ) thay vì nó sẽ xóa record đó đi thì nó sẽ update thời hạn hiện tại vào trường deleted_at, và như vậy bản ghi này đã được ghi lại là đã xóa. Chúng ta cũng hoàn toàn có thể kiểm tra xem một thực thể của Model là được xóa mềm hay không bằng phương pháp trashed ( )

if ($product-&gttrashed()) {
    // Sản phẩm này đã được đánh dấu là đã xóa
}

Truy vấn các bản ghi được xóa “mềm”

Các bản ghi được lưu lại là đã xóa sẽ không có tác dụng trong những truy vấn tài liệu thường thì, để thêm vào những tác dụng từ những bản ghi đã xóa “ mềm ” tất cả chúng ta sử dụng phương pháp withTrashed ( ) :

$comments = Comment::withTrashed()
                -&gtwhere('user_id', 1)
                -&gtget();

Nó sẽ trả về toàn bộ những phản hồi của người dùng có id là 1 với cả những phản hồi thường thì và phản hồi đã được xóa “ mềm ”. trái lại nếu muốn chỉ truy vấn những tác dụng trong những record đã được xóa mềm, sử dụng phương pháp onlyTrashed ( ) :

$comments = Comment::onlyTrashed()
                -&gtwhere('user_id', 1)
                -&gtget();

Khôi phục các bản ghi đã xóa “mềm”

Xóa mềm là một cách rất hay do khi thiết yếu tất cả chúng ta trọn vẹn hoàn toàn có thể Phục hồi được tài liệu đã “ xóa ”, với phương pháp restore ( ), bản ghi đã được Phục hồi trọn vẹn :

// Khôi phục một bản ghi đã xóa "mềm"
$comment-&gtrestore();
// Khôi phục nhiều bản ghi đã xóa "mềm" thông qua truy vấn
Comment::onlyTrashed()-&gtwhere('user_type', '=', 'admin')-&gtrestore();

Xóa vĩnh viễn bản ghi

Chúng ta có xóa “ mềm ” thì cũng phải có xóa “ cứng ” hay còn gọi là xóa vĩnh viễn bản ghi, tức là khi triển khai bản ghi đó sẽ không còn trong database và như vậy những truy vấn thường lẫn truy vấn xóa “ mềm ” không còn tác dụng gì tương quan. Thực hiện xóa “ cứng ” bằng phương pháp forceDelete ( ) :

// Xóa cứng một bản ghi
$comment-&gtforceDelete();

Query Scope – Phạm vi truy vẫn

Phạm vi truy vấn xuất phát từ một yếu tố khi tất cả chúng ta muốn thực thi cùng một số ít điều kiện kèm theo ràng buộc truy vấn với một hoặc nhiều những truy vấn, tất cả chúng ta không cần phải lặp lại chúng cho tất những truy vấn mà chỉ cần định nghĩa những Scope và sử dụng lại chúng trong định nghĩa Model. Tính năng xóa “ mềm ” ( Soft delete ) ở phần trên là một ví dụ, những ràng buộc về trường deleted_at được lặp lại cho toàn bộ những truy vấn, thay vì truy vấn nào tất cả chúng ta cũng đưa thêm những ràng buộc với trường deleted_at thì tất cả chúng ta tạo ra những Scope .

Phạm vi toàn cục

Với khoanh vùng phạm vi toàn cục, định nghĩa Scope này sẽ được vận dụng cho một Model và tổng thể những truy vấn tương quan đến Model đó sẽ được vận dụng thêm ràng buộc. Ví dụ tất cả chúng ta tạo ra một Scope có tên là AgeScope. php nằm trong thư mục app \ scopes ( nếu chưa có bạn tự tạo ra ) :

', 18);
    }
}

Đây là một lớp thừa kế lại Illuminate \ Database \ Eloquent \ Scope và sử dụng phương pháp apply ( ) để khai báo những ràng buộc thêm vào. Ở đây, tất cả chúng ta thêm vào một ràng buộc là tuổi phải lớn hơn 18. Khi muốn vận dụng Scope với khoanh vùng phạm vi toàn cục này, triển khai ghi đè phương pháp boot với việc khai báo thêm phương pháp addGlobalScope ( ) .

Khi đó, mọi truy vấn bằng Model User sẽ được ràng buộc thêm là người dùng phải đủ 18 tuổi, khi đó nếu bạn sử dụng User :: all ( ) thì nó sẽ build ra truy vấn có dạng :

select * from `users` where `age` > 18

Laravel cũng được cho phép sử dụng Closure, là một cách định nghĩa hàm nâng cao định nghĩa hàm trong một hàm :

', 18);
        });
    }
}

Nếu muốn truy vấn mà không bị tác động ảnh hưởng bởi những Scope đã được vận dụng vào Model sử dụng phương pháp withoutGlobalScopes ( ), phương pháp này nếu không truyền tham số nào vào nó sẽ bỏ lỡ toàn bộ những Scope được vận dụng hoặc tất cả chúng ta hoàn toàn có thể chỉ muốn bỏ những Scope nào đó thì truyền vào mảng tên những Scope đó .

// Bỏ đi toàn bộ các Scope được áp dụng trong Model User
User::withoutGlobalScopes()-&gtget();

// Chỉ bỏ các Scope là FirstScope và SecondScope
User::withoutGlobalScopes([
    FirstScope::class, SecondScope::class
])-&gtget();

Phạm vi cục bộ

Các Scope khoanh vùng phạm vi cục bộ được cho phép bạn định nghĩa những tập ràng buộc để thuận tiện sử dụng cho chính Model đó, do vậy những Scope khoanh vùng phạm vi cục bộ được định nghĩa ngay trong Model .

', 100);
    }

    /**
     * Phạm vi truy vấn là các User đang hoạt động
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeActive($query)
    {
        return $query-&gtwhere('active', 1);
    }
}

 Chú ý: Các Scope khoanh vùng phạm vi cục bộ được định nghĩa bởi những hàm trong Model với tên mở màn bằng scope ( scopePopular, scopeActive … ). Khi đó bạn hoàn toàn có thể sử dụng những Scope đã được định nghĩa này trong những truy vấn như sau :

$users = User::popular()-&gtactive()-&gtorderBy('created_at')-&gtget();

Lấy toàn bộ những user có lượng bầu chọn lớn hơn 100 và đang hoạt động giải trí .

Phạm vi truy vấn động

Đôi khi bạn muốn những khoanh vùng phạm vi truy vấn gật đầu một tham số nguồn vào, cùng xem ví dụ sau :

Sau đó, chúng ta có thể truyền tham số khi gọi các Scope này:

Xem thêm: 3 cách đọc PDF online trên máy tính, PC bằng trình duyệt web đơn giản nhất

$users = App\User::ofType('admin')-&gtget();

Các sự kiện khi thao tác cơ sở dữ liệu

Eloquent Model sẽ tạo ra những sự kiện khi thao tác với cơ sở tài liệu, những sự kiện này gồm có : creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored. Với những sự kiện này, bạn thuận tiện thực thi được những việc làm khác trước khi triển khai một thao tác nào đó với database. Để khai báo sử dụng những sự kiện này với một Model, tất cả chúng ta sử dụng thuộc tính USD events :

 UserSaved::class,
        'deleted' => UserDeleted::class,
    ];
}

Khi đó Model User sẽ tạo ra những sự kiện saved và deleted khi những bản ghi được lưu và những bản ghi được xóa khỏi cơ sở tài liệu. Công việc còn lại là lắng nghe những sự kiện và giải quyết và xử lý chúng khi sự kiện xảy ra .

Source: https://www.lesabeilles.biz
Category: Mạng Internet

Filed Under: Mạng Internet

Leave a Reply Cancel reply

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

Giới Thiệu

Kubet là cái tên đang được quan tâm và nhắc đến nhiều nhất trong làng game đổi thưởng, game cá cược hiện nay, đặc biệt là các game thủ Việt Nam.

Chuyên Mục

  • Dàn đề
  • Du lịch
  • Lô Đề
  • Mạng Internet
  • Nhà Cái
  • Phong thủy

Bài viết mới

  • Nằm mơ rụng răng hàm dưới là điềm gì? Mơ răng rụng báo hiệu điều gì?
  • Nằm mơ thấy gãy răng chảy máu điềm báo gì? Đánh con gì?
  • Nằm mơ thấy gà đẻ trứng đánh con gì? Đánh số mấy dễ trúng?

Copyright 2021 © KUBET