คุณจะตรวจสอบ "ถ้าไม่เป็นโมฆะ" กับ Eloquent อย่างไร


218

คุณจะตรวจสอบว่าเขตข้อมูลไม่เป็นโมฆะด้วย Eloquent ได้อย่างไร

ฉันพยายามModel::where('sent_at', 'IS NOT', DB::raw('null'))->...แต่มันให้IS NOTเป็นการผูกแทนที่จะเป็นการเปรียบเทียบ

นี่คือสิ่งที่DB::getQueryLog()พูดเกี่ยวกับมัน:

  '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

คุณสามารถลองใช้!=แทนไม่ได้
JaTochNietDan

1
@JaTochNietDan ตัวดำเนินการ! = ไม่ทำงานกับค่า NULL ตามเอกสาร MySQL : "คุณไม่สามารถใช้ตัวดำเนินการเปรียบเทียบทางคณิตศาสตร์เช่น =, <, หรือ <> เพื่อทดสอบ NULL ได้"
Soulriser

คำตอบ:


402

ฝีปากมีวิธีการที่ (Laravel 4. * / 5 *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

1
ฉันต้องตรวจสอบโมฆะที่เขตข้อมูลที่ถูกลบดังนั้นฉันจึงเปลี่ยนมันเป็น whereNull('deleted_at')และฉันได้รับแบบสอบถามของฉันทำงาน
Tarunn

7
คุณสมบัติอื่นที่ไม่มีเอกสาร ดีเว้นแต่คุณจะนับเอกสาร API แต่เอกสารหลักของ Laravel ไม่ได้กล่าวถึง
aross

12
whereNotNull()วิธี (และอื่น ๆ อีกหลายที่ไม่มีเอกสารก่อนหน้านี้) ถูกเพิ่มเข้าไปในเอกสารในรุ่น 5.1: laravel.com/docs/5.1/queries#where-clauses
Ben Johnson

@aross แต่ใน Query Builder ไม่ใช่ใน Eloquent (Laravel 5.1)
pmiranda

@ pmiranda ไม่แน่ใจว่าคุณหมายถึงอะไร แต่ความคิดเห็นของฉันเมื่อ 4 ปีที่แล้วและเกี่ยวกับ Laravel 4 ทุกวันนี้เราอยู่ที่ Laravel 6 ฉันคิดว่าสถานการณ์เปลี่ยนไป แม้ว่าเอกสารหลักของ Laravel ยังไม่สมบูรณ์มาก แต่ก็ให้ความรู้สึกเหมือนเป็นไกด์นำทาง
aross

20

ถ้ามีคนอย่างฉันต้องการที่จะทำกับผู้สร้างแบบสอบถามใน Laravel 5.2.23 ก็สามารถทำได้เช่น ->

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

หรือมีขอบเขตในรูปแบบ:

public function scopeNotNullOnly($query){

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

1
สิ่งที่ไม่'and'ยืนหา?
senty

1
จริงๆแล้วที่นี่ 'และ' ไม่ทำอะไรเลย แต่มันจะทำอย่างไรถ้าพารามิเตอร์แรกจะเป็นอาร์เรย์ นี่คือต้นแบบของวิธีการ: public function where($column, $operator = null, $value = null, $boolean = 'and'); และตำแหน่งที่ตั้ง -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur



4

ฉันเห็นคำถามนี้ค่อนข้างเก่า แต่ฉันพบว่ามันหาคำตอบ แม้ว่าฉันจะไม่ประสบความสำเร็จกับคำตอบที่นี่ฉันคิดว่าอาจเป็นเพราะฉันใช้PHP 7.2และLaravel 5.7 หรือเป็นไปได้เพราะฉันเพิ่งเล่นกับข้อมูลบางส่วนใน CLI โดยใช้ Laravel Tinker

ฉันมีบางสิ่งที่ฉันพยายามทำเพื่อฉันและคนอื่น ๆ ที่ไม่ได้หวังว่าจะช่วยเหลือผู้อื่น


ฉันไม่ประสบความสำเร็จในการทำงาน:

    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();    // []

ทั้งหมดข้างต้นส่งคืนอาร์เรย์ว่างสำหรับฉัน


อย่างไรก็ตามฉันประสบความสำเร็จในการทำงาน:

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

สิ่งนี้ส่งคืนผลลัพธ์ทั้งหมดในอาร์เรย์ตามที่ฉันคาดไว้ หมายเหตุ: คุณสามารถดร็อปall()และรับIlluminate \ Database \ Eloquent \ Collectionแทนอาร์เรย์ได้หากคุณต้องการ


0

ในlaravel 5.4รหัสModel::whereNotNull('column')นี้ไม่ทำงานคุณต้องเพิ่มget()เช่นนี้หนึ่งModel::whereNotNull('column')->get();นี้ทำงานได้ดีสำหรับฉัน


-11

หากคุณต้องการค้นหาบันทึกที่ถูกลบ (Soft Deleted Record) อย่าใช้ Eloquent Model Query ใช้ Db :: table query แทนการใช้ด้านล่าง:

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

ใช้:

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

คำตอบนี้ไม่เกี่ยวข้องกับคำถาม นอกจากนั้นคุณไม่จำเป็นต้องใช้Db::tableเพื่อค้นหาระเบียนที่ถูกลบแบบอ่อน คุณสามารถกรองพวกเขาด้วยวิธีการwithTrashed()ตามที่บอกไว้ในเอกสาร: laravel.com/docs/5.3/eloquent
gvsrepins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.