我在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_id
和grade_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.
我该如何解决这个问题?
答案 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);
}]);
(这是考虑到您已经在模型中设置了关系)