【问题标题】:Create conditional query in laravel在 laravel 中创建条件查询
【发布时间】:2021-08-27 14:13:05
【问题描述】:

我想把这个查询变成laravel方式

select * from brands inner join products on brands.id = products.brandid where categoryid = '1' and (productname like 'search' or brands.name = 'search')

我试过了

$search = $request->allsearch;

$product = DB::table('brands')->join('products', 'brands.id', '=', 'products.brandid')
            ->where('categoryid', '=', 1)
            ->where(function ($product, $search) {
            $product->where('productname','like','%'.$search.'%')
                     ->orWhere('brands.name','like','%'.$search.'%');
           });

但我遇到了一个错误 Too few arguments to function App\Http\Controllers\ProductController::App\Http\Controllers\{closure}(), 1 passed and exactly 2 expected

我已经尝试过使用when,但没有成功。

有什么想法吗?

【问题讨论】:

    标签: sql laravel laravel-7 laravel-6


    【解决方案1】:

    在回调函数中你应该传递查询实例,对于额外的参数你可以在 use() 中传递它

        $product = DB::table('brands')->join('products', 'brands.id', '=', 'products.brandid')
                    ->where('categoryid', '=', 1)
                    ->where(function ($query)use($search) {
                     if(!empty($search)){
                    $query->where('productname','like','%'.$search.'%')
                             ->orWhere('brands.name','like','%'.$search.'%');
    }
                   });
    

    【讨论】:

      【解决方案2】:

      不要使用其他答案查询,因为它太可怕了,有一种专门用于此的方法...read the documentation...这是您能读到的最好的答案之一...

      $search = $request->allsearch;
      
      $product = DB::table('brands')
          ->join('products', 'brands.id', '=', 'products.brandid')
          ->where('categoryid', 1)
          ->when(!empty($search), function ($query) use ($search) {
              return $query->where(function ($product) use ($search) {
                  return $product->where('productname', 'like', "%$search%")
                      ->orWhere('brands.name', 'like', "%$search%");
                  });
              });
          });
      

      这是 laravel 的方式...并尽量避免 100% 使用 DB::table(...)->join()... Taylor 和 Laravel 团队为此花时间创建 Relations... 不要丑化您的代码...

      【讨论】:

      • .query as it is wrong 意味着什么意思。你是说查询性能糟糕还是代码质量糟糕
      • 我的意思是代码质量。记住你没有使用关系!!!
      • 我同意了。我只给出了解决操作问题的解决方案。是的,但如果我们给出关系,那么这将需要时间。我只根据问题回答。
      • 我知道,我仍在使用 OP 给出的可怕代码。我的主要意思是你使用了一个严重缩进的 IF 作为我的when 加法。
      • 。我同意你的观点。最初我虽然你指的是查询返回无效结果或查询性能问题。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 2020-10-11
      • 2019-03-21
      • 1970-01-01
      • 2019-10-12
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多