Php 使用即时加载过滤结果
我正在laravel中为API创建搜索,但搜索结果错误。我正在尝试按位置和食物类型搜索。我有以下表格:Php 使用即时加载过滤结果,php,laravel-5,Php,Laravel 5,我正在laravel中为API创建搜索,但搜索结果错误。我正在尝试按位置和食物类型搜索。我有以下表格: 食物 商店 食品店 使用者 评论 这是我的搜索代码: public function searchShop($food, $location) { // if($food == " " || $location == " "){ return $this->index(); } //get all records where city
public function searchShop($food, $location)
{
//
if($food == " " || $location == " "){
return $this->index();
}
//get all records where city and food are equal to
$shops = Shop::where('city', '=', $location)
->with('comments.user')
->with(['foods'=> function($query) use($food){
$query->where('name','=', 'fish pepper'); }])
->get();
//check if empty and return all
if($shops->isEmpty()){
return $this->index();
}
return $shops;
}
我的结果是下面的结果,而不仅仅是位置和食物的记录,它显示了按位置过滤的所有商店,即使食物不匹配:您正在使用的
with
方法不会按照您认为的方式进行过滤。您的代码实际上过滤了食物结果,告诉Elounting检索所有商店
,或者不检索食物,或者检索名为鱼椒
的食物。这称为约束急切负载
您正在寻找的方法是whereHas
,而不是with
。这称为查询关系是否存在
$shops = Shop::where('city', '=', $location)
->with('comments.user')
->whereHas('foods', function($query) use($food){
$query->where('name','=', 'fish pepper');
})
->get();
现在,这将只返回具有名称为“鱼椒”的相应食品条目的商店
如果内存可用,whereHas
实际上不会为您填充食物
,但在这种情况下,您不需要它,因为可以安全地假设它们都有鱼椒
。如果您确实想提取所有食物,请将with('comments.user')
更改为with(['comments.user','foods')
可以找到whereHas的文档以及实现此目的的其他方法
可以找到有关您使用with
方法所做工作的文档
希望这能有所帮助。您正在使用的
with
方法不会以您认为的方式进行过滤。您的代码实际上过滤了食物结果,告诉Elounting检索所有商店
,或者不检索食物,或者检索名为鱼椒
的食物。这称为约束急切负载
您正在寻找的方法是whereHas
,而不是with
。这称为查询关系是否存在
$shops = Shop::where('city', '=', $location)
->with('comments.user')
->whereHas('foods', function($query) use($food){
$query->where('name','=', 'fish pepper');
})
->get();
现在,这将只返回具有名称为“鱼椒”的相应食品条目的商店
如果内存可用,whereHas
实际上不会为您填充食物
,但在这种情况下,您不需要它,因为可以安全地假设它们都有鱼椒
。如果您确实想提取所有食物,请将with('comments.user')
更改为with(['comments.user','foods')
可以找到whereHas的文档以及实现此目的的其他方法
可以找到有关您使用with
方法所做工作的文档
希望有帮助