database - Laravel 有更好的方法来编写我的数据库查询,也许是条件子句
问题描述
我有一个分类广告项目,用户可以在其中发布帖子。我有一个“帖子”模型,它有一个城市、类别和子类别。当用户搜索分类广告时,我编写的代码如下所示:
$posts = Post::all();
if($city != 'uk')
{
$posts = $posts->where('city', $city);
}
if($category != 'cat')
{
$posts = $posts->where('category', $category);
}
if($sub_category != 'all')
{
$posts = $posts->where(['category' => $category, 'sub_category' => $sub_category]);
}
城市、类别和子类别变量来自加载的 URL。
我在问是否有更有效的方法来编写代码并获得结果?因为如果 Posts 数据库表变得非常大,每次用户点击该 URL 时我都会得到很多结果,然后过滤结果。另外,我想对结果进行分页,但不能让它工作?
提前致谢。
解决方案
不确定对您有多大帮助,但您也可以这样做
$posts = Post::query();
$posts->when($city != 'uk', function ($q) use($city){
$q->where('city',$city);
});
$posts->when($category != 'cat', function ($q) use($category){
$q->where('category',$category);
});
$posts->when($sub_category != 'all', function ($q) use($sub_category,$category){
$q->where(['category' => $category, 'sub_category' => $sub_category]);
});
$posts = $posts->get();
推荐阅读
- java - 在运行简单的 selenium+java 代码时遇到异常?
- android - ionic 4 - android后退按钮不适用于标签栏路线
- c++ - 使用两个 while 循环的简单 C++ 代码说明
- r - 如何调整和删除交叉表图中的图例标签?
- typescript - VSCode typescript intellisense 不建议嵌套命名空间中的接口
- html - 波兰语字符有不同的权重
- php - 巧妙地解析 PHP 日期时间
- javascript - 用相似的子对象解构 JS 对象
- loops - 在 Ada 中的第一个索引之后开始的数组循环?
- php - 数组值自动增加一个设定值(例如,如果第一个是 echo $myarray[5];下一个是 echo $myarray[5+5];所以真的是 $myarray[10];)