2017-03-02 118 views
1

我剛開始學習Laravel,並且作爲我的首發者,我正在學習本教程視頻系列。 https://youtu.be/Y1TkLkGhHwA試圖瞭解Laravel中的表關係

我想了解這兩個表關係如何在模型級別工作。

Order.php

public function customer(){ 
    return $this->belongsTo('App\Customer'); 
} 

我有點明白這是Laravel如何使用belongsTo方法使兩個表之間的關係。 (我只是接受它,因爲它是)

但是當我使用在其他模型該模型中,Order.php定義customer()功能變得對象實例的屬性($命令 - >客戶 - >名)(?)。這是一部分,我不明白或者只是缺乏OOP知識......

路線\ web.php

Route::get('orders',function(){ 
    $orders = App\Order::all(); 
    foreach($orders as $order){ 
     echo $order->name . 'belongs to' . $order->customer->name; 

回答

1

如果我理解你的擔心,你只是與所謂渴望困惑正在加載。您可以在這裏瞭解更多關於此的信息:https://laravel.com/docs/5.4/eloquent-relationships#eager-loading

會發生什麼,幕後Laravel懶惰在單個查詢中加載「客戶」數據。因此,在您的foreach示例中,如果您有10個訂單,則將執行10個不同的查詢以獲取客戶數據。

下一次你做,比如說,$order->customer->email,它不會再做一個查詢,因爲那個客戶數據在第一個查詢期間已經被加載了。

按照我給你的鏈接,你會發現驚人的東西。

+0

我按照你的建議閱讀文檔,我有點不明白。謝謝(你的)信息。引用'當作爲屬性訪問Eloquent關係時,關係數據是「延遲加載」。這意味着關係數據在第一次訪問屬性之前並未實際加載。我另外有了Laravel提供的「急切加載」和「Lasy加載」的想法。再次感謝! – norixxx

+0

我的榮幸,如果我的回答有助於您的查詢,請將其標記爲已解決。謝謝:) – EddyTheDove

+0

我注意到,當使用Eager Load時,函數名必須與模型名相同。這是有效的:'public function customer()',但這不是'public function foo()'。我認爲這可能是任何名字。 – norixxx