Hùng biện - không đâu bằng


110

Tôi hiện đang sử dụng phiên bản Laravel mới nhất.

Tôi đã thử các truy vấn sau:

Code::where('to_be_used_by_user_id', '<>' , 2)->get()
Code::whereNotIn('to_be_used_by_user_id', [2])->get()
Code::where('to_be_used_by_user_id', 'NOT IN', 2)->get()

Lý tưởng nhất, nó sẽ trả về tất cả các bản ghi ngoại trừ user_id = 2, nhưng nó trả về mảng trống. Làm cách nào để giải quyết vấn đề này?

Code::all()

Điều này trả về tất cả 4 bản ghi.

Mô hình mã:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Code extends Model
{

    protected $fillable = ['value', 'registration_id', 'generated_for_user_id', 'to_be_used_by_user_id', 'code_type_id', 'is_used'];

    public function code_type()
    {
        return $this->belongsTo('App\CodeType');
    }

}

Câu trả lời:


215

Sử dụng wherevới một !=toán tử kết hợp vớiwhereNull

Code::where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id')->get()

1
Nó đang bỏ qua các bản ghi NULL. Nếu tôi thay đổi một trong các NULL thành một số id không phải NULL khác với 2, bản ghi đó sẽ được trả về. Bởi 'nó', ý tôi là MySQL.
aBhijit

Hãy cẩn thận, đó là một cái bẫy.
Yevgeniy Afanasyev

23

Đối với where field not emptyđiều này đã làm việc cho tôi:

->where('table_name.field_name', '<>', '')

14

Trong khi điều này có vẻ hiệu quả

Code::query()
    ->where('to_be_used_by_user_id', '!=' , 2)
    ->orWhereNull('to_be_used_by_user_id')
    ->get();

bạn không nên sử dụng nó cho các bảng lớn, vì theo quy tắc chung "hoặc" trong mệnh đề where của bạn đang dừng truy vấn để sử dụng chỉ mục. Bạn đang chuyển từ "Tra cứu khóa" sang "quét toàn bộ bảng"

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Thay vào đó, hãy thử Union

$first = Code::whereNull('to_be_used_by_user_id');

$code = Code::where('to_be_used_by_user_id', '!=' , 2)
        ->union($first)
        ->get();

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.