无法使用laravel雄辩地获取数据

时间:2019-08-18 17:15:35

标签: php mysql laravel laravel-5 eloquent

我想要的是,当用户访问此链接/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);
}

但是最后我得到了这个结果。数据为空[]。

enter image description here

我想知道为什么我无法获取数据。我做错了哪一部分?

3 个答案:

答案 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 caselaravel docs

答案 2 :(得分:0)

要真正获取结果,您应该使用一些从数据库获取数据的函数,例如getfirst(取决于您要获取多行还是仅获取第一行)。现在,您只准备应执行的查询,但从未执行,因此您应该更改行:

$bonus = Filterer::apply($request, $size, $bonus);

进入

$bonus = Filterer::apply($request, $size, $bonus);
$bonus = $bonus->get();

执行查询并获取结果。