2016-07-07 78 views
0

我們有兩個模型和方法歷史雄辯模型訪問的方法調用關係數據

class Employment_request extends Model { 
    protected $table = 'employment_requests'; 
    // some code here 
    public function history(){ 
     return $this->hasMany('App\Employment_history'); 
    } 
} 


class Employment_history extends Model { 
    protected $table = 'employment_history'; 
    // some code 
} 

讓Employment_request的創建實例:

$r = Employment_request::find(28) 

在這種情況下,方法的歷史數據請求時, Employment_request的實例已創建。不是嗎?
- 對象需要更多的內存
- 需要更多的時間來創建它
- 訪問對象創建的心不是後加歷史數據

,因爲當我添加新的歷史紀錄:

Employment_history::create([ 
    'user_id' => 17, 
    'employment_request_id' => 28, 
    'change' => '? Stefanka' 
]); 

和呼叫方法:

$r->history; 

一個新的記錄沒有與集合返回,但重新創建對象後它是。 但是,當我打電話:

$r->history()->get() 

我不需要重新創建,以獲得新的數據。

它是如何工作的? 在修補程序控制臺中測試。

+0

'在這種情況下,在創建Employment_request實例時請求方法歷史數據。不是嗎?',只有當你打電話給'歷史記錄'時才能使用; –

+0

Lets countinue ... –

+0

添加的結果... –

回答

1

laravel中有三種類型的方法來加載關係數據。急於加載,延遲加載和懶惰加載。急切加載當您檢索父模型數據時,您必須添加您必須將關係名稱傳遞給with方法(Employment_request::with('history')->find(28)),那麼您可以通過將其作爲類變量($r->history;)調用來訪問該關係。如果您使用此方法,則只會在檢索父模型數據時在數據庫上提供關係記錄。如果您想在手動添加新關係記錄後獲得關係,則必須使用從數據庫中檢索最新數據的延遲加載方法($r->history()->get())。這就是爲什麼你不能通過方法訪問你的新記錄(急切加載)。

+0

謝謝您的評論。我的3個結論怎麼樣(除了最後一個)。他們是否正確? –

+0

在方法主體中使用簡單的查詢:**返回Employment_history :: where('employment_request_id',$ this-> id); **似乎是一個更好的解決方案,指定了關係。 –

+0

取決於您用於獲取關係數據的方法,因爲要加載它是真實的,但對於延遲加載或惰性加載,您可以獲取新記錄。爲了通過關係保存新記錄laravel有自己的方法(附加,同步和保存)。嘗試儘可能使用熱切加載加載數據,這比其他方法更快 –