count():参数必须是实现Countable的数组或对象

Kha*_*hri 20 laravel laravel-5 laravel-scout

我面临着奇怪的情况.我在生产环境中遇到错误,而在开发环境中工作正常.

开发:Laravel 5.4.28 PHP 7.0.13 MYSQL 5.7.17

制作:Laravel 5.4.28 PHP 7.2.1 MYSQL 5.7.20

在实现代码中.我用了:

namespace App;
use Illuminate\Support\Facades\Storage;
use Laravel\Scout\Searchable;
use Illuminate\Database\Eloquent\Model;

class Artwork extends Model
{
  use Searchable;
Run Code Online (Sandbox Code Playgroud)

在开发中它工作正常.但是在生产中它给了我这个错误:count():参数必须是一个数组或在Builder.php中实现Countable的对象(第936行)

正如你在这张照片中看到的: 在这里输入图像描述 任何想法背后的原因是什么?以及如何解决?

小智 28

/ 将此代码放在您的路径文件的开头,它将正常工作 /

if(version_compare(PHP_VERSION, '7.2.0', '>=')) {
    error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,是的,古老的策略只是忽略问题。祝你好运! (14认同)
  • 我的天啊!现在的开发社区发生了什么?把头埋在沙子里不是解决办法,修复代码才是。坏代码就是坏代码,尽管您可以隐藏它生成的警告或通知。不要使用此方法来“解决”问题。如果您使用它,那是因为您在生产中更新了 PHP,而没有在 DEV/STAGE 环境中完全验证代码(不好的举动)。然而,如果你告诉我这是因为你的“共享主机”更新了他们的 PHP 导致它出现在你的网站上,你可以在修复代码时将其用作紧急步骤,永远不要超越它!然后,改变托管! (5认同)

Ben*_*old 27

这是PHP 7.2中记录的更改.您需要将Laravel更新为5.6或将PHP降级到7.1版.


Aki*_*yed 16

代替

$originalWhereCount = count($query->wheres);
Run Code Online (Sandbox Code Playgroud)

经过

$originalWhereCount = count((array)$query->wheres);
Run Code Online (Sandbox Code Playgroud)

\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php

  • **永远不要**修改 `vendor/` 目录中的文件。 (13认同)

小智 7

出现此错误的原因是您使用的是较高的 PHP 版本,而您的 Laravel 应用程序使用的是较旧的 PHP 版本。

\n
\n

\xe2\x9c\x85 简单的解决方案:

\n
\n

打开:app/Providers/AppServiceProvider.php

\n

并在:public function register() { ... }函数中添加以下代码:

\n
if(version_compare(PHP_VERSION, '7.2.0', '>=')) {\n    error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Far*_*bas 6

我在Laravel 5.6中面临类似的问题。我在基于对象的数组出错的地方。我知道那个特定变量中的数据将始终是对象,因此我曾经将对象转换为数组。这是代码示例: $objectData = (array)$objectData; echo "Total Elements in array are: ".count($objectData);


Ars*_*mad 6

当我更新到PHP 7.2时, 我的服务器运行的是PHP 7.1我遇到了同样的问题。

搜索后我找到了为什么会发生这种情况。(发生这种情况是因为 PHP 更新。)。

所以在我的情况下,错误是通过类型转换解决的。

我只是更新我曾经计算过的所有代码

//this is before     
count($adminDetails)
Run Code Online (Sandbox Code Playgroud)

更新后

//after update all i typecast all the code where i used count
count((array)$adminDetails)
Run Code Online (Sandbox Code Playgroud)

祝你好运


小智 5

在 php 7.2+ 中 count 不适用于关系对象,您需要使用:

$model->relation()->exists()
Run Code Online (Sandbox Code Playgroud)

不是这个(小于 php 7.2):

count($model->relation)
Run Code Online (Sandbox Code Playgroud)