我想要的是,当用户访问此链接/api/bonus?provider[]=MyCompany
时
结果将仅显示提供商= [MyCompany]提供的奖金。
在我的控制器中:
public function all(Request $request)
{
$size = $request->input('size');
$bonus = Bonus::with('category', 'bonus');
$bonus = Filterer::apply($request, $size, $bonus);
$bonus = Filterer::apply($request, $size, $bonus);
return response()->json([
'code' => 0,
'success' => true,
'data' => BonusResource::collection($bonus),
}
我的预期结果是获得等于[MyCompany]
的所有提供者
但是以某种方式该查询不起作用。
过滤器
public static function apply(Request $filters, $size, $bonus)
{
if ($filters->has('provider')) {
$bonus->whereHas('bonus', function ($query) use ($filters) {
$query->whereIn('providers', $filters->input('provider',[]));
});
}
return $bonus->paginate($size);
}
但是最后我得到了这个结果。数据为空[]。
我想知道为什么我无法获取数据。我做错了哪一部分?
答案 0 :(得分:1)
首先,将输入转换为数组,这里我使用explode()
然后循环循环转换后的数组并使用%%
搜索providers
。希望对您有所帮助!
if ($filters->has('provider') && trim($filters->input('provider')) != "") {
$bonus_list->whereHas('bonusCompany', function ($query) use ($filters) {
$providers = explode(',', (trim($filters->input('provider'), '[]')));
foreach ($providers as $key => $provider) {
if ($key == 0) {
$query->where('providers', 'LIKE', ['%' . trim($provider) . '%']);
} else {
$query->orwhere('providers', 'LIKE', ['%' . trim($provider) . '%']);
}
}
});
};
答案 1 :(得分:0)
我可能是错的,但是根据您的代码,函数apply
没有返回任何内容,它将始终为空。它不应该返还$ bonus吗?并且不要忘记get
。
public static function apply(Request $filters, $size, $bonus)
{
if ($filters->has('provider')) {
$bonus->whereHas('bonusRelease', function ($bonus) use ($filters) {
return $bonus->whereJsonContains('providers', $filters->input('provider',[]));
});
}
return $bonus->get();
}
providers
是json类型。您不仅可以使用where in (a,b,c)
进行查询。更改为whereJsonContains
。请检查此链接another case和laravel docs。
答案 2 :(得分:0)
要真正获取结果,您应该使用一些从数据库获取数据的函数,例如get
,first
(取决于您要获取多行还是仅获取第一行)。现在,您只准备应执行的查询,但从未执行,因此您应该更改行:
$bonus = Filterer::apply($request, $size, $bonus);
进入
$bonus = Filterer::apply($request, $size, $bonus);
$bonus = $bonus->get();
执行查询并获取结果。