对于Laravel查询

时间:2018-02-15 15:09:26

标签: sql laravel laravel-5 query-builder

我正在尝试添加for loop来向我的查询添加条件,并在undefined offset 1上返回$ProductSubCategory错误。 $ProductSubCategory的内容是我想要作为条件包含的字符串数组。

$Product = Product::select('id','ProductWorkpiece','ProductCategory','ProductName','ProductImage','ProductSubCategory')
    ->where('Status','=','1')
    ->Where(function ($query) use ($ProductSubCategory) {
        for ($i=1; $i <= $ProductSubCategory ; $i++) { 
            $Product->where('ProductSubCategory', '=', $ProductSubCategory[$i]);
        }
    })->get();

https://pastebin.com/uDSywsQv(Laravel Query Builder代码段)

这是我想使用Laravel的查询构建器复制的MySQL查询,我将如何进行此操作?

SELECT 
    `id`,
    `ProductWorkpiece`,
    `ProductCategory`,
    `ProductName`,
    `ProductImage`,
    `ProductSubCategory`
FROM
    `Product`
WHERE 
    `ProductSubCategory` = 'Laser Marking Machine' OR 
    `ProductSubCategory` = 'Dot Marking Machine' OR 
    `ProductSubCategory` = 'Digital Microscope' AND 
    `Status` = '1'

https://pastebin.com/AMWCz32g(所需的MySQL代码段)

2 个答案:

答案 0 :(得分:0)

查看此$ProductSubCategory不是数组,也不具有1索引。根据{{​​1}}的内容,您可以使用一些方法。

解决方案1:$ ProductSubCategory是一个字符串数组

$ProductSubCategory

在这里你可以使用$Product = Product::select('id','ProductWorkpiece','ProductCategory','ProductName','ProductImage','ProductSubCategory') ->where('Status','=','1') ->whereIn('ProductSubCategory', $ProductSubCategory) ->get(); 并指定字符串数组,不需要循环任何东西。

解决方案2.1:$ ProductSubCategory是记录的对象集合

whereIn()

在这里,我们使用$Product = Product::select('id','ProductWorkpiece','ProductCategory','ProductName','ProductImage','ProductSubCategory') ->where('Status','=','1') ->where(function ($query) use ($ProductSubCategory) { foreach($ProductSubCategory as $subcategory) { $query->orWhere('ProductSubCategory', '=', $subcategory->name); } })->get(); 遍历每个对象记录,然后使用foreach而非name

引用该对象的orWhere字段

$ subcategory-&gt; name用作占位符,使用适用于您的字段名称。

注意在您的版本中,您执行了WHERE foo = bar AND foo = bar2 AND foo = bar3,但后来引用了function($query)而不是$Product来执行您的where子句。

修改/更新

解答2.2:$ ProductSubCategory是记录的对象集合

$query

这与解决方案1相同,只是我们使用收集方法$subCategories = $ProductSubCategory->only('name')->toArray(); $Product = Product::select('id','ProductWorkpiece','ProductCategory','ProductName','ProductImage','ProductSubCategory') ->where('Status','=','1') ->whereIn('ProductSubCategory', $subCategories) ->get(); 仅检索only()字段(相应地更改),然后转换名称name,它可以用作toArray()条件的一部分。 这是我未经测试的,但应该在理论上工作

我知道whereIn的内容和类型会更有帮助。

答案 1 :(得分:0)

内置tou循环$ Product无法访问尝试使用$ query替换:

$ query-&gt; where(&#39; ProductSubCategory&#39;,&#39; =&#39;,$ ProductSubCategory [$ i]);