Красномовні - там, де не дорівнює


110

Зараз я використовую останню версію 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');
    }

}

Відповіді:


215

Використовуйте whereз !=оператором у поєднанні зwhereNull

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

1
Це ігнорування записів NULL. Якщо я зміню один з NULL на якийсь не-NULL id, крім 2, цей запис повертається. Під «це» я маю на увазі MySQL.
aBhijit

Будьте обережні, це пастка.
Євгеній Афанасьєв


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.