Làm thế nào để bạn kiểm tra nếu không null không với Eloquent?


218

Làm thế nào để bạn kiểm tra nếu một trường không null với Eloquent?

Tôi đã thử Model::where('sent_at', 'IS NOT', DB::raw('null'))->...nhưng nó mang lại IS NOTnhư một sự ràng buộc thay vì so sánh.

Đây là những gì DB::getQueryLog()nói về nó:

  'query' => string 'select * from my_table where sent_at = ? and profile_id in (?, ?) order by created_at desc' (length=101)
  'bindings' => 
    array (size=3)
      0 => string 'IS NOT' (length=6)
      1 => int 1
      2 => int 4

Bạn có thể thử sử dụng !=thay vì KHÔNG.
JaTochNietDan

1
@JaTochNietDan Toán tử! = Không hoạt động với các giá trị NULL. Theo Tài liệu MySQL : "Bạn không thể sử dụng các toán tử so sánh số học như =, <hoặc <> để kiểm tra NULL."
Soulriser

Câu trả lời:


402

Eloquent có một phương thức cho điều đó (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Ấu trùng 3:

Model::where_not_null('sent_at')

1
Tôi cần kiểm tra null tại trường đã xóa, vì vậy tôi đã thay đổi điều này thành whereNull('deleted_at')và tôi đã chạy truy vấn của mình.
Tarunn

7
Một tính năng không có giấy tờ . Chà, trừ khi bạn đếm các tài liệu API, nhưng tài liệu chính của Laravel không đề cập đến nó.
vào

12
Các whereNotNull()phương pháp (và một số người khác đã được cung cấp tài liệu trước đây) đã được thêm vào các tài liệu trong phiên bản 5.1: laravel.com/docs/5.1/queries#where-clauses .
Ben Johnson

@aross nhưng trong Trình tạo truy vấn, không phải trong Eloquent (Laravel 5.1)
pmiranda

@pmiranda không chắc ý của bạn là gì, nhưng nhận xét của tôi là 4 năm trước và về Laravel 4, ngày nay chúng tôi đang ở Laravel 6. Tôi đoán tình hình đã thay đổi. Mặc dù tài liệu chính của Laravel vẫn chưa hoàn thiện, nhưng nó có cảm giác giống như một loạt các hướng dẫn.
vào

20

Nếu ai đó như tôi muốn làm điều đó với trình tạo truy vấn trong Laravel 5.2.23 thì có thể thực hiện như ->

 $searchResultQuery = Users::query(); 
 $searchResultQuery->where('status_message', '<>', '', 'and'); // is not null
 $searchResultQuery->where('is_deleted', 'IS NULL', null, 'and'); // is null 

Hoặc với phạm vi trong mô hình:

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}

1
những gì hiện 'and'đứng cho?
senty

1
Trên thực tế ở đây 'và' không làm gì ngoài việc tham số đầu tiên sẽ là một mảng. Đây là nguyên mẫu phương thức:public function where($column, $operator = null, $value = null, $boolean = 'and'); và vị trí -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur


4

Chúng ta có thể sử dụng

Model::whereNotNull('sent_at');

Hoặc là

Model::whereRaw('sent_at is not null');

4

Tôi thấy câu hỏi này hơi cũ nhưng tôi chạy qua nó để tìm câu trả lời. Mặc dù tôi không thành công với các câu trả lời ở đây nhưng tôi nghĩ điều này có thể là do tôi đang dùng PHP 7.2Laravel 5.7.hoặc có thể bởi vì tôi chỉ chơi xung quanh với một số dữ liệu về CLI bằng cách sử dụng Laravel Tinker.

Tôi có một số điều tôi đã cố gắng làm việc cho tôi và những người khác mà tôi không hy vọng sẽ giúp được những người khác.


Tôi đã không chạy thành công:

    MyModel::whereNotNull('deleted_by')->get()->all();             // []
    MyModel::where('deleted_by', '<>', null)->get()->all();        // []
    MyModel::where('deleted_by', '!=', null)->get()->all();        // []
    MyModel::where('deleted_by', '<>', '', 'and')->get()->all();   // []
    MyModel::where('deleted_by', '<>', null, 'and')->get()->all(); // []
    MyModel::where('deleted_by', 'IS NOT', null)->get()->all();    // []

Tất cả những điều trên đã trả lại một mảng trống cho tôi


Tuy nhiên tôi đã chạy thành công:

    DB::table('my_models')->whereNotNull('deleted_by')->get()->all(); // [ ... ]

Điều này trả về tất cả các kết quả trong một mảng như tôi mong đợi. Lưu ý: bạn có thể thả all()và lấy lại Illuminate \ Database \ Eloquent \ Collection thay vì một mảng nếu bạn thích.


0

trong laravel 5.4Model::whereNotNull('column')này không hoạt động, bạn cần thêm get()như thế này mã Model::whereNotNull('column')->get();này hoạt động tốt với tôi.


-11

Nếu bạn muốn tìm kiếm bản ghi đã xóa (Bản ghi đã xóa mềm), đừng sử dụng Truy vấn mô hình Eloquent. Thay vào đó, hãy sử dụng Db :: bảng truy vấn, ví dụ: Thay vì sử dụng Dưới đây:

$stu = Student::where('rollNum', '=', $rollNum . '-' . $nursery)->first();

Sử dụng:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();

Câu trả lời này không liên quan gì đến câu hỏi. Ngoài ra, bạn không cần sử dụng Db::tableđể tìm các bản ghi bị xóa mềm. Bạn có thể lọc chúng bằng phương thức withTrashed(), như được nói trong các tài liệu: laravel.com/docs/5.3/eloquent
gvsrepins 7/11/2016
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.