簡體   English   中英

為什么雄辯的模型關系不使用括號,它們如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM