从laravel中收集所有对象

时间:2018-07-20 18:36:17

标签: php ajax laravel collections

我在laravel中使用Ajax来创建sideBar过滤器搜索,过滤具有等级的产品。用户选中一些复选框并使用以下ajax代码发送它们:

 $(document).ready(function (event) {
    $('#Filter_Result').click(function (event) {
        var grades = [];
        $('input[id="grade"]:checked').each(function (index, elem) {
            grades.push($(elem).val());
        });
        $.ajax({
            url: '/Products/Filter',
            type: 'get',
            data:{
                grades : grades,
            },
            dataType : 'html'
        })
            .done(function (response)
        {
            console.log(response);
            $('#Products').html(response);
        });
    });
});

我的表是productgrades,其中有product_idgrade_name列以及products表,我的控制器在这里:

if ($request->price =="" && is_null($request->subjects))
    {
        for ($i = 1; $i<= sizeof($request->grades); $i++) {
           $product_id= Productgrade::where('grade_name',$request->grades[$i- 
           1])->pluck('product_id');
           for($j=1;$j<=sizeof($product_id);$j++)
           {
              $arr[] = Product::where('id',$product_id[$j-1]);
           }
        }
    }
    $products = collect($arr);
    return view('Products.Main', [
        'products' => $products,  
    ]);

然后在Main.blade.php中,我试图获取具有以下代码的产品属性:

@foreach($products as $product)
{{$product->id}}
@endforeach

但是我给了这个错误:

Property [id] does not exist on this collection instance.

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您实际上并没有执行查询。您只是在创建查询构建器实例,必须运行first()以获得第一个结果,或者运行get()从查询构建器获取集合。

$arr[] = Product::where('id',$product_id[$j-1])->first();

尽管,如果您已经有一组产品ID,为什么不只运行一个查询来获取产品集合呢?

$products = Product::whereIn('id', $product_id)->get();

答案 1 :(得分:0)

我认为您只是在创建QueryBuilders集合。

在这一部分:

$arr[] = Product::where('id',$product_id[$j-1]);

这部分生成一个QueryBuilder,您只需创建它的一个集合。尝试将其更改为此:

$arr[] = Product::where('id',$product_id[$j-1])->get();

但是,如果您想获得具有特定grade_name的产品,请尝试以下操作:

Product::with(['product_grade' => function($query) use ($value) {
    $query->where('grade_name', $value);
}]);

(这是考虑到您已经在模型中设置了关系)