【问题标题】:Able to get collection, but not filtered data in production version of Slim app using Eloquent能够在使用 Eloquent 的 Slim 应用程序的生产版本中收集但不能过滤数据
【发布时间】:2017-02-18 07:00:53
【问题描述】:

我一直在开发 Slim 2,最近才开始部署到生产服务器。到目前为止,一切似乎都运行良好。我可以登录,所以我知道我可以很好地连接到数据库。它识别出我登录的人,并识别出我作为该用户拥有的权限。我有另一个表有几个条目。当我这样做时......

$collection = collect($app->item->where('user_id', $userId)->get());

然后……

print_r($collection);

在生产服务器上,我可以像在开发服务器上一样看到整个集合,但是当我添加...

$pack = $collection->where('status', 1);

而不是打印集合,尝试打印包...

print_r($pack);

这条消息回来了...

Illuminate\Support\Collection Object ( [items:protected] => Array ( ) )

如我所料,我在开发版本中获得过滤后的集合的位置。如何更改代码以同时在开发和生产环境中工作?

【问题讨论】:

  • 会不会是您的集合中没有状态为 1 的产品正在生产中,但您确实有一些状态为 1 的正在开发中?
  • 你试过链接 where 函数吗?例如:$app->item->where('user_id', $userId)->where('status', 1)->get();并确保数据库有一些状态为 1 的行。
  • 我已验证生产数据库和返回的集合中有状态为 1 的项目。当我制作有效的集合时,我尝试成功链接 where('status', 1) ,但我还需要进一步过滤 where status = 1 和 where status = 0 并且我不想点击 db超过必要。
  • 对于您登录的特定用户呢?该用户在生产中是否存在状态 = 1 的项目?
  • @quickshiftin 我可以查看该用户的集合,而不是从那个用户制作的过滤下来的集合,就像我上面所说的那样,当我将 where's 链接在一起时,它也可以工作。

标签: eloquent slim


【解决方案1】:

您很可能在生产数据库中没有 status 为 1 的记录,而您确实有 status 为 1 的记录在开发中。

直接在生产中检查数据库进行验证。

【讨论】:

    【解决方案2】:

    显然该集合中只有字符串,否则它只会匹配一个字符串......这行得通!

    $pack = $collection->where('status', '1');
    

    【讨论】:

    • 很高兴您找到了解决方案,请点赞。我怀疑 Slim 在内部使用 === 将第二个参数与数据库中的结果进行比较,而不是 ==。可以通过查看代码找出答案......不过,最大的谜团是您的代码如何在开发中工作,而不是在生产环境中工作,而无需将第二个参数设为字符串。
    • @quickshiftin 上面你建议检查数据库的结构。我能找到的唯一区别是本地版本使用 InnoDB,而远程版本使用 MyISAM。不确定这是否是问题的根源,但我已更改开发以匹配生产。
    • 我说的是记录的值,而不是数据库的结构(模式)。假设架构至少是相同的。本质上,当相同的代码在 dev 中工作但在 prod 中工作时,只需要消除差异以确定问题所在。尽管如此,仍然没有得到这个问题的答案。为什么在不更改代码的情况下在两种环境中得到不同的结果?
    【解决方案3】:

    检查您的 Eloquent 版本。 5.3 之前的集合在使用 where() 时使用严格比较,而要使用松散则使用 whereLoose(),但从 5.3 开始,where() 是松散比较,whereStrict() 是严格方法调用。

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2023-02-04
      • 2017-04-02
      • 1970-01-01
      相关资源
      最近更新 更多