[Bài đọc] Truy xuất dữ liệu

3. Làm việc với Cơ sở dữ liệu

Lấy nhiều Models

Khi bạn tạo được một model và kết hợp nó với bảng trong cơ sở dữ liệu, bạn có thể sẵn sàng truy xuất dữ liệu từ cơ cở dữ liệu. Hãy coi mỗi Eloquent model như một query builder cho phép bạn thực hiện truy vấn thông suốt tới cơ sở dữ liệu. Ví dụ:

<?php
use App\Flight;

$flights = App\Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}

Thêm ràng buộc bổ sung

Phương thức all() sẽ trả về tập kết quả trong bảng của model. Vì mỗi Eloquent model được sử dụng như một query builder nên bạn có thể tạo ràng buộc cho các truy vấn, sau đó sử dụng phương thức get() để lấy kết quả:

$flights = App\Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

Lưu ý: Vì các Eloquent model là các query builder, bạn nên xem qua tất cả các phương thức có sẵn của query builder. Bạn có thể sử dụng bất cứ phương thức nào với Eloquent query.

Collections

Vì các phương thức Eloquent như all() và get() đều trả về nhiều kết quả, một thể hiện từ lớp Illuminate\Database\Eloquent\Collection sẽ được trả về. Lớp Collection cung cấp một vài phương thức hữu ích để làm việc với các kết quả Eloquent: 

$flights = $flights->reject(function ($flight) {
    return $flight->cancelled;
});

Tất nhiên, bạn có thể sử dụng vòng lặp foreach với collection giống như với mảng:

foreach ($flights as $flight) {
    echo $flight->name;
} 

Chunking Results

Nếu bạn muốn xử lý hàng ngàn kết quả từ Eloquent, sử dụng phương thức chuck. Phương thức này sẽ lấy từng chunk của Eloquent model, cung cấp chúng thông qua Closure để xử lý. Sử dụng phương thức này sẽ tiết kiệm bộ nhớ khi thao tác với tập kết quả lớn:

Flight::chunk(200, function ($flights) {
    foreach ($flights as $flight) {
        //
    }
});

Tham số đầu tiên truyền cho phương thức là số bản ghi mà bạn lấy từng chunk (khối). Closure truyền vào ở tham số thứ hai sẽ gọi mỗi chuck được lấy từ cơ sở dữ liệu. Một truy vấn sẽ được thực thi để lấy mỗi chuck của các bản ghi truyền vào Closure. 

Sử dụng Cursor

Phương thức cursor cho phép bạn duyệt qua các bản ghi trong cơ sở dữ liệu sử dụng cursor. Khi xử lý với dữ liệu lớn, phương thức cursor có thể được sử dụng để giảm việc sử dụng bộ nhớ:

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
    //
}

Truy xuất một  model 

Ngoài việc lấy tất cả dữ liệu trong bảng, bạn có thể sử dụng phương thức find và first để lấy về một kết quả. Thay vì trả về một tập các model, những phương thức này trả về một đối tượng model:

// Retrieve a model by its primary key...

$flight = App\Flight::find(1);

// Retrieve the first model matching the query constraints...

$flight = App\Flight::where('active', 1)->first(); 

Bạn có thể gọi phương thức find với một mảng các khóa chính với kết quả trả về là một tập các bản ghi tìm thấy:

$flights = App\Flight::find([1, 2, 3]);

Not Found Exceptions

Thỉnh thoảng bạn muốn ném ra một ngoại lệ nếu model không được tìm thấy. Điều này thực sự hữu ích khi làm việc với route hay controller. Phương thức findOrFail và firstOrFail sẽ trả lại kết quả đầu tiên được tìm thấy; tuy nhiên, nếu không có kết quả được trả về một

Illuminate\Database\Eloquent\ModelNotFoundException sẽ được ném ra:

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();

Nếu ngoại lệ không được bắt, một HTTP response 404 sẽ tự động được gửi lại cho người dùng. Vì thế không cần phải viết mã lệnh kiểm tra sự trả về của response 404 khi sử dụng phương thức:

Route::get('/api/flights/{id}', function ($id) {
    return App\Flight::findOrFail($id);
}); 

Hàm tập hợp

Bạn cũng có thể sử dụng các phương thức như count, sum, max, và các phương thức tập hợp khác được cung cấp bởi query builder. Những phương thức này trả về một kết quả thay vì một model instance:

$count = App\Flight::where('active', 1)->count();

$max = App\Flight::where('active', 1)->max('price');

Leave a Reply

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