Elocuente - donde no es igual a

110

Actualmente estoy usando la última versión de Laravel.

Probé las siguientes consultas:

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, debería devolver todos los registros excepto user_id = 2, pero devuelve una matriz en blanco. ¿Cómo abordo esto?

Code::all()

Esto devuelve los 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');
    }

}
aBhijit
fuente

Respuestas:

215

Usar wherecon un !=operador en combinación conwhereNull

Code::where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id')->get()
lukasgeiter
fuente
1
Está ignorando los registros NULL. Si cambio uno de los NULL a algún ID que no sea NULL que no sea 2, se devuelve ese registro. Por "eso", me refiero a MySQL.
aBhijit
Cuidado, es una trampa.
Yevgeniy Afanasyev
23

Para where field not emptyesto funcionó para mí:

->where('table_name.field_name', '<>', '')
Abduhafiz
fuente
14

Mientras esto parece funcionar

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

no debe usarlo para tablas grandes, porque como regla general "o" en su cláusula where es detener la consulta para usar el índice. Pasará de "Búsqueda de claves" a "Exploración de tabla completa"

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

En su lugar, prueba Union

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

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

O así:

Code::whereNotIn('to_be_used_by_user_id', [2])->get();
Mladen Janjetovic
fuente
no obtiene datos nulos
Imran Hossain