我有一个方法,它只根据传递一个项目的对象与单个对象来更改一件小事情,但在单个项目上count()是错误的……

假设我的表格里有25个条目...

$contacts = Contact::all();
dd("Count = " . $contacts->count());

伯爵= 25

$contact = Contact::where('individual_id', '=', $id)->first();
dd("Count = " . $contact->count());

伯爵= 25

为什么它显示的是表中对象的计数,而不是返回的数量?

  • Laravel v9.19
  • PHP v8.0.2

推荐答案

让我们分析一下您的代码:

$contact = Contact::where('individual_id', '=', $id)->first();

$contact可以是Contact模型的实例,也可以是null.

如果它是一个Model实例,则调用->count()基本上就是调用以下内容:

Contact::count(); // 25

$contact = Contact::where('individual_id', '=', $id)->first();
$contact->count() == Contact::count(); // true

模特有一个count()的方法,所以你可以做$model->where(...)->count()之类的事情.

如果$contactnull,则代码将失败:

$contact = null;
$contact->count(); // Error: `null->count()` is invalid.

因此,对于您的情况,基本上没有理由调用Contact::where(...)->first()->count(),因为它不会返回1,除非您的contacts表中有合法的1条记录(相当可怕的假阳性).

另一个答案建议使用->get(),这是有效的,因为Collection有一个输出底层数组长度的count()方法:

$contact = Contact::where('individual_id', '=', $id)->get();
$contact->count(); // 1

它将返回1,除非数据库中有多条记录,其中individual_id等于$id.

因此,TL;DR:->first()返回单个Contact实例或null,不应该在之后使用->count(),而::all()->get()返回多个实例,可以在之后使用->count().

Laravel相关问答推荐

Vue 组件中的图像不适用于 Vite + Laravel

Laravel + SQLite = SQLSTATE[HY000]一般错误:8次try 写入只读数据库

Laravel:如何通过 id 从集合中删除项目

Laravel 5 如何全局设置 Cache-Control HTTP 标头?

Eloquent 的集合方法,例如 only 或 except 返回一个空集合

合并两个 Eloquent 集合并删除所有重复项.

使用 Laravel Socialite 登录 Facebook

无法安装 Laravel 包 - 干预图像

将非框架 PHP 项目移植到 Laravel 4.x

Laravel 将参数从路由传递到过滤器

php Laravel-遇到格式不正确的数值(在字符串上)

使用 laravel eloquent 关系检索除 NULL 之外的所有记录

如何在 Laravel 中实现数组类型路由?

安装后在 Lumen 中找不到页面

Laravel Mix 生成字体到另一个目录

Laravel 错误声明 App\Exceptions\Handler::report(Throwable $exception)

Laravel 5.3 通知 - 仅使用Electron邮件地址通知

如何在 Laravel 4 中组织不同版本的 REST API 控制器?

日期时间格式无效:1366 字符串值不正确

无法在控制器的构造函数上调用 Auth::user()