Refactor eloquent queries sử dụng higher order messages trong Laravel Chuyên mục PHP và Laravel 2023-07-28 620 Lượt xem 64 Lượt thích 0 Bình luận

Điều tuyệt vời nhất khi làm việc với Laravel là thỉnh thoảng tìm ra một cách thay thế để làm những công việc cũ nhàm chán. Gần đây, mình đã tìm thấy một thứ có tên là “Higher Order Messages” khi làm việc với Eloquent. Tính năng này đã có trong Laravel kể từ phiên bản 5.4.
Higher Order Messages là một thuật ngữ ưa thích được đưa ra cho cơ chế trong đó chương trình máy tính cho phép các messages có các messages khác làm arguments/methods (đối số/phương thức). Nghe có vẻ khó hiểu? Tin mình đi, Hãy hiểu điều này bằng cách sử dụng một ví dụ.
Vì vậy, giả sử chúng ta có một User model được liên kết với users table trông giống như sau:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// nothing here as of now
}
Bây giờ, hãy thử sử dụng User model trong controller. Hãy gọi nó là UserController
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\User;
class UserController extends Controller
{
public function index()
{
return User::where('active', 1);
}
}
Không có gì lạ mắt ở đây. Phương thức index của controller sẽ trả về tất cả active users dưới dạng một mảng json. Nhưng vấn đề ở đây là, nó sẽ trả về tất cả các trường của users table. Nếu chúng ta muốn trả lại các trường cụ thể bằng cách tùy chỉnh, chúng ta có thể làm như vậy.
<?php
class UserController extends Controller
{
public function index()
{
return User::where('active', 1)
->map(function($user) {
return [
'user_id' => $user->id,
'name' => $user->name
'title' => $user->title
]
});
}
}
Như bạn mong đợi, phần trên sẽ rút gọn response để chỉ trả về các trường được chỉ định cho mọi người dùng. Đây là lúc “Higher Order Messages” phát huy tác dụng nếu bạn muốn làm cho đoạn mã trên gọn gàng hơn một chút.
Sử dụng các higher order messages, chúng ta có thể định nghĩa một phương thức (với logic map’s closure) ngay trong model…
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function transform()
{
return [
'user_id' => $this->id,
'name' => $this->name,
'title' => $this->title
];
}
}
Và “pass” nó sang phương thức map trong truy vấn Eloquent như bên dưới.
<?php
class UserController extends Controller
{
public function index()
{
return User::where('active', 1)
->map->transform();
}
}
Ở trên giống như khi chúng ta sử dụng anonymous function trong map. Giờ đây, bạn có thể chuyển trực tiếp method transform của User model sang map. Như bạn có thể thấy, điều này có thể hữu ích khi bạn muốn cấu trúc lại một query and helps giữ clean controllers (hoặc factories) của bạn.
Dưới đây là tất cả các collection methods hỗ trợ higher order messages: average, avg, contains, each, every, filter, first, flatMap, map, partition, reject, sortBy, sortByDesc, and sum.
Bình luận (0)