Home > Software engineering >  orWhere clause optimization
orWhere clause optimization

Time:09-24

I have my block of code like this:

$articulos = Articulo::select('id', 'descripcion', 'status', 'codigo_interno', 'codigo_comercial', 'unidad_medida', 'impuestos_compra', 'validar_peso')
        ->where('descripcion','like', '%' . $palabra_buscar . '%')->where('status', 'activo')
        ->orWhere('codigo_interno','like', '%' . $palabra_buscar . '%')->where('status', 'activo')
        ->orWhere('codigo_comercial','like', '%' . $palabra_buscar . '%')->where('status', 'activo')
        ->get()

What I want is to improve this code by avoiding using a lot of ->where('status', 'activo') statements.

I´m doing this because if I write ->where('status', 'activo') at the end of the query, the only statement that works is the last one. It seems that the orWhere clause resets the query.

Thank you.

CodePudding user response:

Did you try by using a closure?

$articulos = Articulo::select('id', 'descripcion', 'status', 'codigo_interno', 'codigo_comercial', 'unidad_medida', 'impuestos_compra', 'validar_peso')
    ->where('status', 'activo')
    ->where(function($query){
        $query
          ->orWhere('descripcion','like', '%' . $palabra_buscar . '%')
          ->orWhere('codigo_interno','like', '%' . $palabra_buscar . '%')
          ->orWhere('codigo_comercial','like', '%' . $palabra_buscar . '%');
    })
    ->get();

CodePudding user response:

start by filtering by activo for query optmisation, by starting with it yu will next on the second where filter only on activo ariculos.(hope this make sens).

$articulos = Articulo::select('id', 'descripcion', 'status', 'codigo_interno', 'codigo_comercial', 'unidad_medida', 'impuestos_compra', 'validar_peso')
    ->where('status', 'activo')
    ->Where(function($query)use($palabra_buscar) {
            $query->where('descripcion','like', '%' . $palabra_buscar . '%')
    ->orWhere('codigo_interno','like', '%' . $palabra_buscar . '%')
    ->orWhere('codigo_comercial','like', '%' . $palabra_buscar . '%');
        })
    ->get();

CodePudding user response:

please try this

$articulos = Articulo::select('id', 'descripcion', 'status', 'codigo_interno', 'codigo_comercial', 'unidad_medida', 'impuestos_compra', 'validar_peso')
        ->where('descripcion','like', '%' . $palabra_buscar . '%')
        ->orWhere('codigo_interno','like', '%' . $palabra_buscar . '%')
        ->orWhere('codigo_comercial','like', '%' . $palabra_buscar . '%')
         ->where('status', 'activo')
        ->get()
  • Related