2017-03-02 121 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