为什么雄辩的模型关系不使用括号以及它们是如何工作的?

2024-01-08

我在网上搜索了一个小时,但无法弄清楚这一点。如果我们查看雄辩的关系文档:https://laravel.com/docs/5.2/eloquent-relationships https://laravel.com/docs/5.2/eloquent-relationships

用户模型示例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

就在它的下面,如何访问 id=1 用户的电话号码:

$phone = User::find(1)->phone;

为什么phone并不是phone()有什么区别?

还有它是如何工作的?如果我尝试致电object->name如果我的代码中没有括号,PHP 认为我正在寻找一个名为的类变量name?

一些额外信息:

看起来phone正在返回对象(App\Models\Phone)并且phone()正在返回对象(Illuminate\Database\Eloquent\Relations\HasOne)

如果我运行下面的代码:

User::find(1)->phone->count()

框架执行以下 SQL 语句:

select * from `phone` where `phone`.`user_id` = '1' and `phone`.`user_id` is not null limit 1
select count(*) as aggregate from `phone`

如果我运行下面的代码:

User::find(1)->phone()->count()

框架执行以下SQL语句:

select count(*) as aggregate from `phone` where `phone`.`user_id` = '1' and `phone`.`user_id` is not null

一种思考方式是public function phone()函数定义了关系,所以使用$obj->phone()将为您提供 Eloquent 关系本身(而不是该关系的结果),然后您可以根据需要使用各种查询构建器元素进行修改。

省略括号是 Eloquent 添加的简写->get() or ->first()在表达式的末尾(Eloquent 根据函数中定义的是否是 hasOne、hasMany 等关系知道要使用哪个),它返回一个 Eloquent 集合。

So, $obj->phone是相同的$obj->phone()->first().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么雄辩的模型关系不使用括号以及它们是如何工作的? 的相关文章

随机推荐