ฝีปาก - โดยที่ไม่เท่ากับ


112

ฉันกำลังใช้ Laravel เวอร์ชันล่าสุด

ฉันได้ลองใช้คำค้นหาต่อไปนี้:

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()

ตามหลักการแล้วควรส่งคืนระเบียนทั้งหมดยกเว้นuser_id = 2แต่จะส่งคืนอาร์เรย์ว่าง ฉันจะแก้ไขปัญหานี้ได้อย่างไร

Code::all()

สิ่งนี้ส่งคืนทั้ง 4 ระเบียน

รหัสรุ่น:

<?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');
    }

}

คำตอบ:


218

ใช้whereกับตัว!=ดำเนินการร่วมกับwhereNull

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

2
มันไม่สนใจเร็กคอร์ด NULL ถ้าฉันเปลี่ยน NULL ตัวใดตัวหนึ่งเป็น id ที่ไม่ใช่ NULL นอกเหนือจาก 2 เรกคอร์ดนั้นจะถูกส่งกลับ โดย "มัน" ฉันหมายถึง MySQL
aBhijit

ระวังมันเป็นกับดัก
Yevgeniy Afanasyev


14

ขณะนี้ดูเหมือนจะทำงาน

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

คุณไม่ควรใช้สำหรับตารางขนาดใหญ่เพราะตามกฎทั่วไป "หรือ" ในส่วนที่ประโยคของคุณหยุดการสืบค้นเพื่อใช้ดัชนี คุณกำลังเปลี่ยนจาก "การค้นหาคีย์" เป็น "การสแกนแบบเต็มตาราง"

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่

ลองใช้Unionแทน

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

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


0

การดึงข้อมูลด้วยค่าว่างและค่าในกรณีที่เงื่อนไขยุ่งยากมาก แม้ว่าคุณจะใช้เงื่อนไขตรง Where และ OrWhereNotNull ดังนั้นสำหรับทุกแถวคุณจะดึงข้อมูลทั้งสองรายการโดยไม่สนใจเงื่อนไขอื่น ๆ หากนำไปใช้ ตัวอย่างเช่นหากคุณมีเงื่อนไขมากขึ้นซึ่งจะปิดบังเงื่อนไขเหล่านั้นและยังคงส่งคืนด้วยรายการว่างหรือค่าเนื่องจากคุณใช้หรือเงื่อนไข

วิธีที่ดีที่สุดที่ฉันพบมีดังนี้ สิ่งนี้ใช้งานได้ว่าอยู่ที่ไหน

Code::where(function ($query) {
            $query->where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id');                  
        })->get();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.