在 laravel 中创建条件查询

Create conditional query in laravel

我想把这个查询变成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 但没有成功。

有什么想法吗?

在 where 回调函数中,您应该传递查询实例,对于其他参数,您可以在 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.'%');
}
               });

不要使用其他答案查询,因为它太可怕了,有一种专门用于此的方法...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 为此...不要丑化您的代码...