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

Posted

技术标签:

【中文标题】laravel : count(): 参数必须是数组或实现 Countable 的对象【英文标题】:laravel : count(): Parameter must be an array or an object that implements Countable 【发布时间】:2019-05-10 06:12:41 【问题描述】:

我使用的是 Laravel 5.3,我的 php 版本是 7.1

当我调用 SoftDeletes 类时,我得到了那个错误

Builder.php 第 1231 行中的错误异常: count():参数必须是数组或者实现了Countable的对象

这是我的模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;


class Post extends Model


    use SoftDeletes;

    protected $dates = ['deleted_at'];

    protected $fillable = [

        'title','content','image','category_id','slug'
    ];



    public function category()


        return $this->belongsTo('App\Category');
    

它是我的控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Post;

use App\Category;

use Session;

class PostsController extends Controller

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    



        return view('admin.posts.index')->with('posts',Post::all());

    

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    
        $category = Category::all();

        if($category->count() == 0)

            Session::flash('info' , 'You must create at least 1 category to add a new post');

            return redirect()->back();
        

        return view('admin.posts.post')->with('categories',$category);
    

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    

        $this->validate($request,[

            'title'         => 'required|max:255',
            'image'         => 'required|image',
            'content'       => 'required',
            'category_id'   => 'required'
        ]);


        $image = $request->image;

        $image_new_name = time().$image->getClientOriginalName();

        $image->move('/uploads/posts' , $image_new_name);



        $post= Post::create([

            'title'          => $request->title,
            'image'          => '/uploads/posts/' . $image_new_name,
            'content'        => $request->content,
            'category_id'    => $request->category_id,
            'slug'           => str_slug($request->title)
        ]);

        Session::flash('success' , 'You created a new post');

        return redirect()->back();



    

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    
        //
    

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    
        //
    

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    
        //
    

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    
        //
    

当我删除 count() 函数时也会出现同样的错误

我该如何解决这个错误

【问题讨论】:

您需要深入研究,问题不在于您发布的代码。错误消息应指示文件名和行号,其中调用了count()。为了帮助您进行调试,我们需要知道传递给 count() 的内容以及它的来源。 【参考方案1】:

作为一种解决方法,将其添加到您的路由文件中:

if(version_compare(PHP_VERSION, '7.2.0', '>=')) 
    error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);

【讨论】:

【参考方案2】:

我在 laravel find() 方法返回一个对象而不是数组时遇到了同样的问题。因此count() 方法将不起作用。尝试: ***解决方案或

Post::all()->toArray();

将返回一个适用于count() 方法的数组。

【讨论】:

【参考方案3】:

Laravel 5.3 和我的 PHP 版本是 7.1 互不兼容 Refer to this issue in the github

要解决这个错误,你可以做两件事

升级 laravel 5.3 到 laravel 5.5 参考这个(5.3 to 5.4, 5.4 to 5.5) 将你的 php 降级到 php 5.6

【讨论】:

【参考方案4】:

我在C:\laragon\www\mystore\vendor\laravel\framework\src\Illuminate\Database\Eloquent中更改了第1231行

$originalWhereCount = !empty($query->wheres) ? count($query->wheres) : 0;

【讨论】:

更改供应商目录中的代码绝不是一个好主意。 - 一旦你运行 composer update 或 install 命令,这些更改就会消失 - 这些类型的更改会给你带来非常意想不到的应用程序行为 - 相信我,这不是最佳解决方案,因为它会破坏另一个区域的代码 ``` 我个人建议检查您的 laravel 和 php 依赖项并升级支持的 PHP/laravel。在这种情况下。不支持 PHP 5.6,而不支持 PHP 7.2。 ``` 在我们的情况下,有一个旧项目,这是我们唯一的解决方案,直到我们可以升级 php 和 laravel 版本。

以上是关于laravel : count(): 参数必须是数组或实现 Countable 的对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到错误count():参数必须是在laravel中实现Countable的数组或对象?

在laravel中将多个数据插入数据库

PHP 7.4 - 警告:count():参数必须是数组

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

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

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