在 QueryBuilder 中使用 Where - Laravel

Use Where in QueryBuilder - Laravel

我有一个 table Products(id,category_id,name);

我想得到这样的查询结果:

SELECT * FROM Products WHERE category_id=$category_id OR $category_id=0;

当我为 $category_id 分配 0 值时 => 以上查询将 return 所有记录。

如何在 Laravel 中编写该查询?

我试过这个:

Products::where(function($query) use ($category_id){
         $query->where("category_id",$category_id)
        ->orWhere($category_id,0)
})->get();

但是,错误:

看起来像:

SELECT
    *
FROM
    `products` 
WHERE
    ( `product_category_id` = 0 OR `0` = 0 )

并且打印错误:Column not found: 1054 Unknown column '0' in 'where clause'

如何修复:'0' = 00 = 0

谢谢!

使用when():

$products = Product::when($categoryId, function ($query, $categoryId) {
    $query->whereCategoryId($categoryId);
})->get();

只有当条件为真时,此方法才会调用该函数。您可以使用简单的 if 语句实现相同的目的:

$products = Product::query();

if ($categoryId) {
    $products->whereCategoryId($categoryId);
}

$products = $products->get();

使用 when() 的好处是不会破坏链条,因此您可以在一个表达式中使用条件查询更改。例如,如果您只想 return 它,它会很有用。

使用它

Products::where(function($query) use ($category_id){
         $query->where("category_id",$category_id)
        ->orWhere("category_id",0);
})->get();

你的代码有什么问题:

->orWhere($category_id,0)

您将列部分设为变量。

试试这个代码:

Products::where(function($query) use ($category_id){
         return $query->where("category_id", $category_id)
        ->orWhere("category_id", 0);
})->get();
$product = new Products;
if ($category_id != 0) {
    $product = $product->where("category_id", $category_id);
}
$products = $product->get();