484

Tôi đang sử dụng trình tạo truy vấn Laravel Eloquent và tôi có một truy vấn mà tôi muốn có một WHEREmệnh đề trên nhiều điều kiện. Nó hoạt động, nhưng nó không thanh lịch.

Thí dụ:

$results = User::where('this', '=', 1)
    ->where('that', '=', 1)
    ->where('this_too', '=', 1)
    ->where('that_too', '=', 1)
    ->where('this_as_well', '=', 1)
    ->where('that_as_well', '=', 1)
    ->where('this_one_too', '=', 1)
    ->where('that_one_too', '=', 1)
    ->where('this_one_as_well', '=', 1)
    ->where('that_one_as_well', '=', 1)
    ->get();

Có cách nào tốt hơn để làm điều này, hay tôi nên gắn bó với phương pháp này?

|
  • 5
    Có nhiều khả năng về cách điều này có thể được đơn giản hóa, nhưng điều đó sẽ yêu cầu một số mã thực tế hơn. Bạn có thể cập nhật mã để thực tế hơn một chút không? Ví dụ, có những thời điểm khi nhiều ->where(...)cuộc gọi có thể được thay thế bằng một ->whereIn(...)cuộc gọi, vân vân . –  19:08:44 11/10/2013
  • 3
    Giải pháp của @Jarek Tkaczyk nên là câu trả lời, tôi đồng ý. Nhưng tôi muốn mã của bạn giống như tập lệnh trình tạo để hiểu và bảo trì. –  16:17:14 05/11/2018
  • Hy vọng liên kết này sẽ hữu ích cho người dùng trong tương lai, ví dụ điều kiện chuyên sâu: cào –  21:31:35 07/01/2021
749

Trong Laravel 5.3 (và vẫn đúng như 7.x ), bạn có thể sử dụng các wheres chi tiết hơn được truyền dưới dạng một mảng:

$query->where([
    ['column_1', '=', 'value_1'],
    ['column_2', '<>', 'value_2'],
    [COLUMN, OPERATOR, VALUE],
    ...
])

Cá nhân tôi đã không tìm thấy trường hợp sử dụng cho điều này chỉ qua nhiều wherecuộc gọi, nhưng thực tế là bạn có thể sử dụng nó.

Kể từ tháng 6 năm 2014, bạn có thể chuyển một mảng tới where

Miễn là bạn muốn tất cả toán tử wheressử dụng and, bạn có thể nhóm chúng theo cách này:

$matchThese = ['field' => 'value', 'another_field' => 'another_value', ...];

// if you need another group of wheres as an alternative:
$orThose = ['yet_another_field' => 'yet_another_value', ...];

Sau đó:

$results = User::where($matchThese)->get();

// with another group
$results = User::where($matchThese)
    ->orWhere($orThose)
    ->get();

Ở trên sẽ dẫn đến truy vấn như vậy:

SELECT * FROM users
  WHERE (field = value AND another_field = another_value AND ...)
  OR (yet_another_field = yet_another_value AND ...)
|
  • 1
    Làm thế nào để bạn chỉ định nhà điều hành? –  14:08:32 21/01/2015
  • 1
    @Styphon Bạn không. Hiện tại nó chỉ hoạt động với =. –  15:51:41 21/01/2015
  • 1
    @Styphon và điều gì xảy ra nếu tôi muốn tạo WHERE (a IS NOT NULL AND b=1) OR (a IS NULL AND b=2);:? –  16:47:35 30/07/2015
  • 1
    Bạn cũng có thể vượt qua một loạt các điều kiện như thế này:$users = DB::table('users')->where([ ['status', '=', '1'], ['subscribed', '<>', '1'], ])->get(); –  19:19:08 15/09/2016
  • 1
    @jarek: Làm cách nào để đưa whereNotIncâu trả lời của bạn vào câu trả lời của bạn với các câu hỏi khác where? –  05:22:32 09/01/2017
107

Phạm vi truy vấn có thể giúp bạn để mã của bạn dễ đọc hơn.

http://laravel.com/docs/eloquent#query-saries

Cập nhật câu trả lời này với một số ví dụ:

Trong mô hình của bạn, hãy tạo các phương thức phạm vi như sau:

public function scopeActive($query)
{
    return $query->where('active', '=', 1);
}

public function scopeThat($query)
{
    return $query->where('that', '=', 1);
}

Sau đó, bạn có thể gọi phạm vi này trong khi xây dựng truy vấn của mình:

$users = User::active()->that()->get();
|
  • 1
    phương pháp hay nhất cho điều kiện như thế này là gì, query-> where ('start_date'> $ startDate) vẫn ổn khi sử dụng Scopes? –  10:02:34 19/03/2020
93

Bạn có thể sử dụng các truy vấn con trong chức năng ẩn danh như sau:

 $results = User::where('this', '=', 1)
       ->where('that', '=', 1)
       ->where(
           function($query) {
             return $query
                    ->where('this_too', 'LIKE', '%fake%')
                    ->orWhere('that_too', '=', 1);
            })
            ->get();
|
53

Trong trường hợp này, bạn có thể sử dụng một cái gì đó như thế này:

User::where('this', '=', 1)
    ->whereNotNull('created_at')
    ->whereNotNull('updated_at')
    ->where(function($query){
        return $query
        ->whereNull('alias')
        ->orWhere('alias', '=', 'admin');
    });

Nó sẽ cung cấp cho bạn một truy vấn như:

SELECT * FROM `user` 
WHERE `user`.`this` = 1 
    AND `user`.`created_at` IS NOT NULL 
    AND `user`.`updated_at` IS NOT NULL 
    AND (`alias` IS NULL OR `alias` = 'admin')
|
46

Điều kiện sử dụng Array:

$users = User::where([
       'column1' => value1,
       'column2' => value2,
       'column3' => value3
])->get();

Sẽ tạo ra truy vấn như sau:

SELECT * FROM TABLE WHERE column1 = value1 and column2 = value2 and column3 = value3

Điều kiện sử dụng Chức năng Ẩn danh:

$users = User::where('column1', '=', value1)
               ->where(function($query) use ($variable1,$variable2){
                    $query->where('column2','=',$variable1)
                   ->orWhere('column3','=',$variable2);
               })
              ->where(function($query2) use ($variable1,$variable2){
                    $query2->where('column4','=',$variable1)
                   ->where('column5','=',$variable2);
              })->get();

Sẽ tạo ra truy vấn như sau:

SELECT * FROM TABLE WHERE column1 = value1 and (column2 = value2 or column3 = value3) and (column4 = value4 and column5 = value5)
|
13

Nhiều mệnh đề where

    $query=DB::table('users')
        ->whereRaw("users.id BETWEEN 1003 AND 1004")
        ->whereNotIn('users.id', [1005,1006,1007])
        ->whereIn('users.id',  [1008,1009,1010]);
    $query->where(function($query2) use ($value)
    {
        $query2->where('user_type', 2)
            ->orWhere('value', $value);
    });

   if ($user == 'admin'){
        $query->where('users.user_name', $user);
    }

cuối cùng cũng nhận được kết quả

    $result = $query->get();
|
10
Model::where('column_1','=','value_1')
       ->where('column_2 ','=','value_2')
       ->get();

HOẶC LÀ

// If you are looking for equal value then no need to add =
Model::where('column_1','value_1')
        ->where('column_2','value_2')
         ->get();

HOẶC LÀ

Model::where(['column_1' => 'value_1',
              'column_2' => 'value_2'])->get();
|
10

Các whereColumnphương pháp có thể được thông qua một loạt các điều kiện nhiều. Các điều kiện này sẽ được kết hợp bằng cách sử dụng andtoán tử.

Thí dụ:

$users = DB::table('users')
            ->whereColumn([
                ['first_name', '=', 'last_name'],
                ['updated_at', '>', 'created_at']
            ])->get();

$users = User::whereColumn([
                ['first_name', '=', 'last_name'],
                ['updated_at', '>', 'created_at']
            ])->get();

Để biết thêm thông tin, hãy xem phần này của tài liệu https://laravel.com/docs/5.4/queries#where-clauses

|
6
$projects = DB::table('projects')->where([['title','like','%'.$input.'%'],
    ['status','<>','Pending'],
    ['status','<>','Not Available']])
->orwhere([['owner', 'like', '%'.$input.'%'],
    ['status','<>','Pending'],
    ['status','<>','Not Available']])->get();
|
5

Đảm bảo áp dụng bất kỳ bộ lọc nào khác cho các truy vấn phụ, nếu không hoặc có thể thu thập tất cả các bản ghi.

$query = Activity::whereNotNull('id');
$count = 0;
foreach ($this->Reporter()->get() as $service) {
        $condition = ($count == 0) ? "where" : "orWhere";
        $query->$condition(function ($query) use ($service) {
            $query->where('branch_id', '=', $service->branch_id)
                  ->where('activity_type_id', '=', $service->activity_type_id)
                  ->whereBetween('activity_date_time', [$this->start_date, $this->end_date]);
        });
    $count++;
}
return $query->get();
|
3

Với Eloquent, thật dễ dàng để tạo nhiều kiểm tra trong đó:

Đầu tiên: (Sử dụng đơn giản ở đâu)

$users = User::where('name', $request['name'])
    ->where('surname', $request['surname'])
    ->where('address', $request['address'])
    ...
    ->get();

Thứ hai: (Nhóm vị trí của bạn bên trong một mảng)

$users = User::where([
    ['name', $request['name']],
    ['surname', $request['surname']],
    ['address', $request['address']],
    ...
])->get();

Bạn cũng có thể sử dụng điều kiện (=, <>, v.v.) bên trong nơi như thế này:

$users = User::where('name', '=', $request['name'])
    ->where('surname', '=', $request['surname'])
    ->where('address', '<>', $request['address'])
    ...
    ->get();
|
3

Bạn có thể sử dụng tài hùng biện trong Laravel 5.3

Tất cả kết quả

UserModel::where('id_user', $id_user)
                ->where('estado', 1)
                ->get();

Kết quả từng phần

UserModel::where('id_user', $id_user)
                    ->where('estado', 1)
                    ->pluck('id_rol');
|
2

Bạn có thể sử dụng theo một số cách,

$results = User::where([
    ['column_name1', '=', $value1],
    ['column_name2', '<', $value2],
    ['column_name3', '>', $value3]
])->get();

Bạn cũng có thể sử dụng như thế này,

$results = User::orderBy('id','DESC');
$results = $results->where('column1','=', $value1);
$results = $results->where('column2','<',  $value2);
$results = $results->where('column3','>',  $value3);
$results = $results->get();
|
2

Một mẫu mã.

Thứ nhất:

$matchesLcl=[];

mảng được điền ở đây bằng cách sử dụng số lượng / vòng lặp điều kiện mong muốn , tăng dần:

 $matchesLcl['pos']= $request->pos;
$matchesLcl['operation']= $operation;
//+......+
$matchesLcl['somethingN']= $valueN;

và xa hơn nữa với những bài hùng biện như biểu thức thu nhỏ này:

if (!empty($matchesLcl))
    $setLcl= MyModel::select(['a', 'b', 'c', 'd'])
        ->where($matchesLcl)
        ->whereBetween('updated_at', array($newStartDate . ' 00:00:00', $newEndDate . ' 23:59:59'));
else 
    $setLcl= MyModel::select(['a', 'b', 'c', 'd'])
        ->whereBetween('updated_at', array($newStartDate . ' 00:00:00', $newEndDate . ' 23:59:59'));
|
2

Dùng cái này

$users = DB::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();
|
2

Theo đề xuất của tôi nếu bạn đang thực hiện bộ lọc hoặc tìm kiếm

thì bạn nên đi với:

        $results = User::query();
        $results->when($request->that, function ($q) use ($request) {
            $q->where('that', $request->that);
        });
        $results->when($request->this, function ($q) use ($request) {
            $q->where('this', $request->that);
        });
        $results->when($request->this_too, function ($q) use ($request) {
            $q->where('this_too', $request->that);
        });
        $results->get();
|
  • 1
    tìm kiếm có xảy ra ở phía phpside hoặc sql không? –  13:27:22 07/12/2018
  • 1
    Sql bên. Truy vấn sql thực thi dưới dạng tham số yêu cầu. Ví dụ. nếu điều kiện đầu tiên có thông số này. Sau đó, nơi điều kiện này = '' được thêm vào truy vấn. –  15:02:02 07/12/2018
2
DB::table('users')
            ->where('name', '=', 'John')
            ->orWhere(function ($query) {
                $query->where('votes', '>', 100)
                      ->where('title', '<>', 'Admin');
            })
            ->get();
|
2

sử dụng whereInđiều kiện và chuyển mảng

$array = [1008,1009,1010];

User::whereIn('users.id', $array)->get();

|
2

Bạn có thể sử dụng mảng trong mệnh đề where như hình dưới đây.

$result=DB::table('users')->where(array(
'column1' => value1,
'column2' => value2,
'column3' => value3))
->get();
|
0

Chúng tôi sử dụng hướng dẫn này để có được người dùng theo hai điều kiện, loại phân loại người dùng và tên người dùng.

Ở đây chúng tôi sử dụng hai điều kiện để lọc khi bạn nhập ngoài việc tìm nạp thông tin người dùng từ bảng cấu hình để giảm số lượng truy vấn.

$users = $this->user->where([
                    ['name','LIKE','%'.$request->name.'%'],
                    ['trainers_id','=',$request->trainers_id]
                    ])->with('profiles')->paginate(10);
|
0

nếu điều kiện của bạn là như vậy (khớp với một giá trị duy nhất), một cách đơn giản hơn sẽ là:

$results = User::where([
         'this' => value,
         'that' => value,
         'this_too' => value,
          ...
      ])
    ->get();

nhưng nếu bạn cần HOẶC các mệnh đề thì hãy đảm bảo rằng đối với mỗi mệnh đề orWhere () bạn lặp lại điều kiện phải đáp ứng.

    $player = Player::where([
            'name' => $name,
            'team_id' => $team_id
        ])
        ->orWhere([
            ['nickname', $nickname],
            ['team_id', $team_id]
        ])
|
0

Sử dụng Eloquent thuần túy, thực hiện nó như vậy. Mã này trả về tất cả người dùng đã đăng nhập có tài khoản đang hoạt động. $users = \App\User::where('status', 'active')->where('logged_in', true)->get();

|
-1

Bạn có thể làm như sau, đó là cách ngắn nhất.

    $results = User::where(['this'=>1, 
              'that'=>1, 
               'this_too'=>1, 
               'that_too'=>1, 
              'this_as_well'=>1, 
               'that_as_well'=>1, 
                'this_one_too'=>1, 
               'that_one_too'=>1, 
              'this_one_as_well'=>1,
                'that_one_as_well'=>1])->get();
|
-5
public function search()
{
    if (isset($_GET) && !empty($_GET))
    {
        $prepareQuery = '';
        foreach ($_GET as $key => $data)
        {
            if ($data)
            {
                $prepareQuery.=$key . ' = "' . $data . '" OR ';
            }
        }
        $query = substr($prepareQuery, 0, -3);
        if ($query)
            $model = Businesses::whereRaw($query)->get();
        else
            $model = Businesses::get();

        return view('pages.search', compact('model', 'model'));
    }
}
|
-29
$variable = array('this' => 1,
                    'that' => 1
                    'that' => 1,
                    'this_too' => 1,
                    'that_too' => 1,
                    'this_as_well' => 1,
                    'that_as_well' => 1,
                    'this_one_too' => 1,
                    'that_one_too' => 1,
                    'this_one_as_well' => 1,
                    'that_one_as_well' => 1);

foreach ($variable as $key => $value) {
    User::where($key, '=', $value);
}
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.