关于集合中使用 ORM 关联,SQL 使用过多?

我刚用laravel不久,对laravel不是很熟翻,有一些问题想请教一大家。
我发现laravel的orm,是不是对SQL不太感冒?
我在使用一个Eloquent集合,在调用里面关联的时候,我发现他执行了很多多余的SQL,并不是left join
我先贴三个简单的文件,1个controller,2个model

app\Http\Controllers\HomeController.php

<?php
namespace App\Http\Controllers;

use App\Models\Order as ModelOrder;
class HomeController extends Controller
{
    public function index()
    {
        //经过ALMAS大神提点,使用预加载 with 完美解决,注释内为新代码
        //$orders = ModelOrder::with('belongsToUser','belongsToType')->take(10)->get();
        $orders = ModelOrder::take(10)->get();//旧代码
        foreach ($orders as $order){
            echo implode('-',[$order->id,$order->user_id,$order->belongsToUser->name]);
            echo '<br>';
        }
    }
}

app\Models\Order.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\User as ModelUser;
class Order extends Model
{
    protected $table = 'orders';
    public function belongsToUser()
    {
        return $this->belongsTo(ModelUser::class, 'user_id', 'id');
    }
}

app\Models\User.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\Order as ModelOrders;
class User extends Model
{
    protected $table = 'users';  
    public function hasManyOrders()
    {
        return $this->hasMany(ModelOrders::class, 'user_id', 'id');
    }
}

运行当然是可以取得数据的

1-1-crooks.hal
2-2-mitchell.freeda
3-2-mitchell.freeda
4-3-destin16

可是他的方式就让我感叹了,用了这么多SQL

select * from `orders` limit 10
select * from `users` where `users`.`id` = '1' limit 1
select * from `users` where `users`.`id` = '2' limit 1
select * from `users` where `users`.`id` = '2' limit 1
select * from `users` where `users`.`id` = '3' limit 1

这不是没事找事嘛,我以为他会

select * from orders left join users on users.id = orders.user_id  

是我写错了,还是laravel的orm本来就是这样的~?
恳请各位大神指点迷律~

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
ALMAS
最佳答案

你在循环中调用$order->belongsToUser,当然会这样,有多少个order就会有多少条sql,这就是n+1问题,去看文档又说这个的,应该用with方法

5年前 评论
讨论数量: 2
ALMAS

你在循环中调用$order->belongsToUser,当然会这样,有多少个order就会有多少条sql,这就是n+1问题,去看文档又说这个的,应该用with方法

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!