【问题标题】:orWhere clause optimizationorWhere子句优化
【发布时间】:2021-11-17 04:49:45
【问题描述】:

我的代码块是这样的:

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

我想要通过避免使用大量 ->where('status', 'activo') 语句来改进此代码。

我这样做是因为如果我在查询末尾写 ->where('status', 'activo'),唯一有效的语句就是最后一个语句。 orWhere 子句似乎重置了查询。

谢谢。

【问题讨论】:

标签: php laravel


【解决方案1】:

你尝试过使用闭包吗?

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

【讨论】:

  • 将状态移到外壳之外,因为这是一个 AND 子句
  • 谢谢@aynber 我已经更新了我的答案
【解决方案2】:

首先通过 activo 过滤以进行查询优化,从它开始 yu 将在第二个过滤器仅在 activo ariculos 上进行。(希望这有意义)。

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

【讨论】:

    【解决方案3】:

    请试试这个

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

    【讨论】:

    • 这正是 OP 所说的不起作用: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
    猜你喜欢
    • 2020-02-01
    • 2011-10-13
    • 1970-01-01
    • 2020-08-03
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多