我是 Eloquent Query Builder 的新手,我有一些问题:
目标:创建一个查询,该查询将从选择器中获取与指定参数匹配的食谱:
- 菜品类别
- 菜品子类别
- 美食
- 菜单
重要的细微差别:在选择器中,如果不先选择类别,则无法选择子类别(使用 livewire 的依赖下拉逻辑)。
在选择器中选择参数后 URL 如下所示:
http://127.0.0.1:8000/recipes?dish_category=2&dish_subcategory=37&cuisine=1&menu=1
问题:
我注意到我仍然可以删除 url 中的类别 ID 并仅留下子类别:
http://127.0.0.1:8000/recipes?dish_category=&dish_subcategory=37&cuisine=1&menu=1
如何实现用户只能在选择器中输入例如“菜系”的行为,并且查询只选择与该参数匹配的菜谱?
代码:
目前我有这个代码,它显示了正确的数据,但我不确定这是否是使用 URL 参数过滤数据的正确方法:
$recipes = Recipe::with('user', 'cuisine')
->where('dish_category_id', $request->query('dish_category'))
->orWhere('dish_subcategory_id', $request->query('dish_subcategory'))
->orWhere('cuisine_id', $request->query('cuisine'))
->orWhere('menu_id', $request->query('menu'))
->get();
dd($recipes);
并向dd($recipes)
我展示了这个:
Illuminate\Database\Eloquent\Collection {#1085 ▼ // app\Http\Controllers\RecipeController.php:26
#items: array:2 [▼
0 =>
App\Models
\
Recipe {#1116 ▶}
1 =>
App\Models
\
Recipe {#1082 ▶}
]
#escapeWhenCastingToString: false
}
(找到 2 个具有用户指定参数的食谱,此外,如果用户例如仅输入参数类别:肉汤,则会获得相同的结果)
结论:
当前代码可以工作,但我不仅需要它能够工作,而且还需要它能够正确编写,同时我还需要考虑上面描述的问题
将不胜感激您的建议和帮助。
编辑01:
我尝试过以下when()
方法:
$recipes = DB::table('recipes')
->when($dish_category, function ($query, $dish_category){
$query->where('dish_category_id', $dish_category);
})
->when($dish_subcategory, function ($query, $dish_subcategory){
$query->where('dish_subcategory_id', $dish_subcategory);
})
->when($cuisine, function ($query, $cuisine){
$query->where('cuisine_id', $cuisine);
})
->when($menu, function ($query, $menu){
$query->where('menu_id', $menu);
})
->get();
它可以工作,但我仍然可以粘贴URL(当我不允许用户在选择器中dish_subcategory_id
选择时,我不确定这是否是一种好的行为)dish_subcategory
dish_category
如果您只想在设置
dish_subcategory_id
时使用,则正确的方法是:dish_category
请记住,这与初始查询不同
orWhere
(但可能实际上是您想要实现的)。编辑:用于
use()
将所需变量添加到方法范围