使用带和不带()的模型方法有什么区别?

时间:2018-11-30 10:57:47

标签: laravel eloquent

如果我有一个模型可以查询User。并且User有一个外部关联的表Address

public function address() {
   return $this->hasOne('Address', 'id');
}

我的疑问如下: 1.我们可以使用User->addressAddress表中获取一个数据。我们还可以使用User->address()来获取数据。我可以dd来获取属性两种方式有什么区别? 2.当我使用User->address->first()时,它返回Address中的第一个数据,而不是与指定的id匹配的第一个数据。但是我使用User->address()->first()可以获取正确的数据

以上原因是什么?

4 个答案:

答案 0 :(得分:0)

通常,当您使用$user->address时,Laravel在User模型中搜索地址属性或getAddressAttribute()模型中的User方法。

仅当您使用address()之类的()时,才会调用$user->address()方法。

Documentation on Laravel accessors

答案 1 :(得分:0)

在这种情况下,在这种情况下,->address->address()->first的简写,它将查询结果“缓存”在您的User对象上。因此,多次调用->address不会进行其他数据库查询。每次调用->address()->first()都会进行数据库查询。

答案 2 :(得分:0)

主要区别如下

$model->address

返回关系

$model->address()

返回查询构建器的实例,该实例可用于以下进一步约束

$model->address(function($query){
         $query->where('postcode', 'testpostcode');
}

答案 3 :(得分:-1)

据我所知,$model->address获取关系数据项,$model->address()获取自定义语句的关系模型实例。如果要使用$ model-> address(),则必须使用任何查询生成器方法来获取任何数据。等等。$model->address()->where('status', true)->get() $model->address()->count()