我正在尝试编写查询以过滤表,但是看起来有些不对劲。
$city = $request->get("city");
$price = $request->get("price");
首先检查计划表是否为空。然后开始编写过滤查询。
->groupBy("address","place_name")
->when($keyword, function($query, $keyword) {
return $query->where("place_name", "LIKE", "%$keyword%");
})
->when($city, function($query, $city) {
return $query->where("city", "LIKE", "%$city%");
})
查询工作到basic_info表。但是当我$keyword在basic_info表中搜索时会弹出错误提示 调用模型> [App \ Model \ Place]上未定义的关系[basic_infos]。
->when($keyword, function($query) use ($keyword){
$query->with(["basic_infos" => function($query, $keyword){
return $query->where("basic_info.wedding_style", "LIKE", "%$keyword%");
}]);
})
//plan table
->when($price, function($query) use ($price){
$query->with(["basic_infos" => function($query, $price){
return $query->where("plans.plan_price", "<=", $price);
}]);
})
->paginate(20);
return $datas;
但是实际上它是定义的。这是模特
放置模型
{
return $this->hasMany("App\Model\BasicInfo");
}
基本信息模型
{
return $this->belongsTo("App\Model\Place");
}
但是在->when函数内部的查询中,当我使用->with它时,似乎发生了问题。我想,我在错误的时间使用了它,否则…… plan表的查询肯定也会发生同样的事情。正确的方法是什么?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的描述来看,问题出在你尝试使用with
进行关联查询时的上下文和语法。with
用于预加载(eager loading)关联模型,而你在when
条件闭包中使用它的方式似乎有些混淆了关联关系的调用以及如何正确传递变量到闭包中。
首先,确保你理解了Eloquent ORM中关联关系的定义:在Place
模型中定义的hasMany("App\Model\BasicInfo")
表明一个Place
可以有多个BasicInfo
,而在BasicInfo
模型中的belongsTo("App\Model\Place")
则表示一个BasicInfo
属于一个Place
。
针对你的代码,这里有一个修正建议:
直接在主查询上应用过滤条件:如果你想要基于$keyword
、$city
和$price
来过滤结果,并且这些条件可能涉及到了关联表basic_info
和当前操作的表(假设是Plan
),那么应该直接在查询链中加入这些条件,而不是通过with
预加载的方式去实现过滤逻辑。
处理关联查询:当你确实需要预加载关联数据以减少查询次数时,应确保正确地构建关联查询,但过滤逻辑通常不在这个环节处理。
修正示例代码:根据你的需求,看起来你想根据关键词搜索place_name
或wedding_style
,同时根据城市和价格筛选。下面是一个更清晰的示例,假设你正在处理的是Plan
模型,且计划与地点(Place
)有关联,地点又与基本信息(BasicInfo
)有关联:
$datas = Plan::query();
// 城市过滤
if ($city) {
$datas->whereHas('place', function ($query) use ($city) {
$query->where('city', 'LIKE', "%$city%");
});
}
// 价格过滤
if ($price) {
$datas->where('plan_price', $price); // 或者使用范围查询如 whereBetween 如果你需要价格区间
}
// 关键词搜索,同时在两个表中查找
if ($keyword) {
$datas->where(function ($query) use ($keyword) {
$query->where('place_name', 'LIKE', "%$keyword%")
->orWhereHas('place.basicInfos', function ($query) use ($keyword) {
$query->where('wedding_style', 'LIKE', "%$keyword%");
});
});
}
// 分页
$datas = $datas->with(['place' => function ($query) {
// 如果需要预加载关联的地方,可以在这里添加,例如加载所有关联的基本信息
$query->with('basicInfos');
}])->paginate(20);
return $datas;
这段代码首先构建了一个对Plan
模型的查询,然后根据条件逐步添加了过滤逻辑。注意,我使用了whereHas
来过滤与Place
关联的数据,这允许你基于关联表的字段进行过滤。对于关键词搜索,我同时在Plan
表的place_name
字段和通过关联的BasicInfo
模型的wedding_style
字段中进行了模糊匹配。
请根据你的实际数据库结构和模型关系调整上述代码。