Laravel Advanced Wheres làm thế nào để truyền biến vào hàm?


86

Ví dụ trong doc:

DB::table('users')
        ->whereExists(function($query)
        {
            $query->select(DB::raw(1))
                  ->from('orders')
                  ->whereRaw('orders.user_id = users.id');
        })
        ->get();

Nhưng điều gì sẽ xảy ra nếu tôi cần sử dụng biến bên ngoài như vậy:

            ->where('city_id', '=', $this->city->id)
            ->where(function($query)
                {
                    $query->where('name', 'LIKE', '%'.$searchQuery.'%')
                    ->orWhere('address', 'LIKE', '%'.$searchQuery.'%')

                })

Hiện tại, tôi đã tạo thuộc tính mới và truy cập nó thông qua $this->, nhưng có cách nào thuận tiện hơn không?

Câu trả lời:


225

Bạn có thể chuyển các biến cần thiết từ phạm vi cha vào bao đóng bằng usetừ khóa.

Ví dụ:

DB::table('users')->where(function ($query) use ($activated) {
    $query->where('activated', '=', $activated);
})->get();

Thêm về điều đó ở đây .

EDIT (bản cập nhật 2019):

PHP 7.4 (sẽ được phát hành vào ngày 28 tháng 11 năm 2019 ) giới thiệu một biến thể ngắn hơn của các hàm ẩn danh được gọi là các hàm mũi tên , làm cho điều này ít dài dòng hơn một chút.

Một ví dụ sử dụng PHP 7.4 gần như tương đương về mặt chức năng (xem gạch đầu dòng thứ 3 bên dưới):

DB::table('users')->where(fn($query) => $query->where('activated', '=', $activated))->get();

Sự khác biệt so với cú pháp thông thường:

  • fntừ khóa thay vì function.
  • Không cần phải liệt kê rõ ràng tất cả các biến cần được nắm bắt từ phạm vi cha - điều này hiện được thực hiện tự động theo giá trị. Xem việc thiếu usetừ khóa trong ví dụ sau.
  • Các hàm mũi tên luôn trả về một giá trị. Điều này cũng có nghĩa là không thể sử dụng voidkiểu trả về khi khai báo chúng.
  • Các returntừ khóa phải được bỏ qua.
  • Các hàm mũi tên phải có một biểu thức duy nhất là câu lệnh trả về. Các chức năng nhiều dòng hiện không được hỗ trợ. Bạn vẫn có thể chuỗi các phương pháp.

15

Câu trả lời của @kajetons là đầy đủ chức năng.

Bạn cũng có thể chuyển nhiều biến bằng cách chuyển chúng như: use($var1, $var2)

DB::table('users')->where(function ($query) use ($activated,$var2) {
    $query->where('activated', '=', $activated);
    $query->where('var2', '>', $var2);
})->get();

5

Nếu bạn đang sử dụng Laravel hùng biện, bạn cũng có thể thử điều này.

$result = self::select('*')
                    ->with('user')
                    ->where('subscriptionPlan', function($query) use($activated){
                        $query->where('activated', '=', $roleId);
                    })
                    ->get();

2

Bạn có thể chuyển các biến bằng cách sử dụng ...

$status =1;
 $info = JOBS::where(function($query) use ($status){        
         $query->where('status',$status);
         })->get();
print_r($info);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.