【问题标题】:couldn't get data using laravel eloquent无法使用 laravel eloquent 获取数据
【发布时间】:2019-08-18 17:15:35
【问题描述】:

我想要的是当用户访问此链接时/api/bonus?provider[]=MyCompany 结果将仅显示 providers=[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);
}

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

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

【问题讨论】:

  • 如果您需要更多信息,请告诉我
  • 剩下的代码是什么?因为在那里,您似乎忘记了最终的get()count() 获取数据的方法
  • 提供者在任何时候都只是一个提供者吗?即我的公司?如果是这样,您可以通过比较 where('provider', $singleCompany) 或类似内容来简化查询。另外 - 建议您将函数内的奖励更改为不同的变量,如$query,因为它可能会重叠。最后,正如@bjovanov 所说,您有一个查询但还没有集合,因为您没有调用 final 方法从数据库中获取集合。使用get() 获取所有奖励版本。也许在您的问题上添加更多信息,了解您需要什么(一家公司、多家等)。
  • 你的控制器函数没有返回任何东西。
  • @Watercayman 是的,我有几个提供者的名称,我已经将变量更改为$query,但仍然无法得到结果

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:

要真正获得结果,您应该使用一些从数据库中获取数据的函数,例如getfirst(取决于您是要获取多行还是只获取第一行)。现在你只准备了应该执行的查询,但你从不执行它,所以你应该换行:

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

进入

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

执行查询并获取结果。

【讨论】:

    【解决方案2】:

    我可能是错的,但根据你的代码,函数apply 没有返回任何东西,它总是空的。不应该是 return $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

    【讨论】:

    • 嗨,检查我的更新答案@StackOverFlowSavedMyLife
    • 不好意思说,但结果还是一样,没有数据显示
    • @StackOverFlowSavedMyLife 确保Filter 中的whereHas 函数也返回查询。我看到你的代码仍然没有返回任何东西。如果不是拼写错误,请检查关系。并且过滤器区分大小写。
    • 在这行`$bonus->whereHas('bonusRelease', function ($bonus) use ($filters)`我可以知道function($bonus) use ($filters指的是什么吗?原因是我从文档中读到的是 whereHas('column', function(Builder $query){} 和你的不一样
    • 它可以是依赖注入或参数类型以防止随机值(检查PSR)。它没有任何区别。您应该检查 PHP 中的 Closure。让我们更加专注。你能提供给我们 Api 资源代码吗?你能告诉我们过滤前后的数据吗?
    【解决方案3】:

    首先,将输入转换为数组,这里我使用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) . '%']);
                        }
                    }
                });
            };
    

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2020-11-25
      • 2021-12-10
      • 2021-12-07
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      相关资源
      最近更新 更多