Eloquent - onde não é igual a


110

Atualmente estou usando a última versão do Laravel.

Eu tentei as seguintes perguntas:

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

Idealmente, ele deve retornar todos os registros user_id = 2, exceto , mas retorna uma matriz em branco. Como faço para resolver isso?

Code::all()

Isso retorna todos os 4 registros.

Modelo de código:

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

}

Respostas:


215

Use wherecom um !=operador em combinação comwhereNull

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

1
Ele está ignorando registros NULL. Se eu alterar um dos NULLs para algum id não NULL diferente de 2, esse registro será retornado. Por 'isso', quero dizer MySQL.
aBhijit

Cuidado, é uma armadilha.
Yevgeniy Afanasyev

23

Para where field not emptyisso funcionou para mim:

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

14

Enquanto isso parece funcionar

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

você não deve usá-lo para tabelas grandes, porque como regra geral "ou" em sua cláusula where está interrompendo a consulta para usar o índice. Você está indo de "Pesquisa de chave" para "verificação completa da tabela"

insira a descrição da imagem aqui insira a descrição da imagem aqui

Em vez disso, tente o Union

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.