关于集合中使用 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本来就是这样的~?
恳请各位大神指点迷律~
推荐文章: