我正在laravel中为API创建搜索,但我的搜索给了我错误的结果。我想按地点和食物类型搜索。我有以下表格:
这是我的搜索代码:
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;
}
答案 0 :(得分:0)
您使用的with
方法不会按您认为的方式进行过滤。您的代码实际上过滤了食物结果,告诉Eloquent检索所有Shop
并且没有食物或名称为fish pepper
的食物。这称为约束急切负载。
您要查找的方法是whereHas
而不是with
。这被称为查询关系存在。
$shops = Shop::where('city', '=', $location)
->with('comments.user')
->whereHas('foods', function($query) use($food){
$query->where('name','=', 'fish pepper');
})
->get();
现在只返回Shop
个具有相应食品条目fish pepper
的商品。
如果内存服务,whereHas
实际上不会为您填充foods
,但在这种情况下您不需要它,因为可以安全地假设它们都有fish pepper
。如果您确实想要提取所有食物,请将with('comments.user')
更改为with(['comments.user', 'foods'])
。
可以找到whereHas
的文档及其他实现方法[{3}}。
可以找到有关使用with
方法执行操作的文档here。
希望有所帮助。