[英]Why eloquent model relationships do not use parenthesis and how do they work?
我一直在網上搜索一個小時,但無法解決。 如果我們看一下雄辯的關系文檔: 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
的類變量?
一些額外的信息:
看起來電話正在返回對象(App \\ Models \\ 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()
或->first()
(Eloquent根據是否具有hasOne,hasMany等關系來知道要使用哪個關系,如函數),它返回一個Eloquent集合。
因此, $obj->phone
與$obj->phone()->first()
。
我不了解Laravel / Eloquent,所以您需要顯示find()
方法以獲取更多信息,但是User::find(1)
返回一個對象,因此->phone
訪問該對象的phone
屬性。 這與您顯示的find()
方法無關。 它比這樣做的時間短:
$obj = User::find(1);
$phone = $obj->phone;
做一個var_dump($obj);
您應該會看到一個phone
屬性。 如果不是,則另一種可能性是該類實現__get()
魔術方法,以便當您嘗試訪問phone
屬性時,它將運行phone()
方法並返回該值。
關於第一個解釋,對數組也可以這樣做:
function test() { return array('phone'=>'713-555-1212'); }
echo test()['phone'];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.