【发布时间】:2017-11-14 20:25:48
【问题描述】:
我有以下模型:CardBoard、User、UserPricingPlans、PricingPlanLimits
注意:不要介意模型代码是否有问题。它们工作正常。
纸板
class CardBoard extends Model{
public function user(){
return $this->belongsTo('Models\User','id_user');
}
}
用户
class User extends Model{
public function pricingPlans(){
return $this->hasMany('Models\UserPricingPlan','id_user');
}
}
定价计划
class PricingPlan extends Model{
public function limits(){
return $this->hasOne('Models\PricingPlanLimits','id_pricing_plan','id_pricing_plan');
}
}
PricingPlanLimits
我不会描述那个模型,它不是问题所必需的。但请记住,有一个名为 maxBoards 的属性。
问题是我只有 CardBoard 模型实例可以处理,我想从 PricingPlanLImits 获取 maxBoard 属性。所以我这样做了:
注意:我这里已经有 CardBoard 模型实例了!
$maxBoard = $cardBoard->user->pricingPlans->last()->limits->maxBoard;
return $maxBoard;
上面的代码运行良好,但是这个操作生成的查询数量对我来说是一个开销。 Eloquent 为调用的 每个关系 执行 SELECT,我不想要所有这些数据和操作。
{
"query": "select * from `users` where `users`.`id_user` = ? limit 1",
"bindings": [
],
"time": 0.96
}
{
"query": "select * from `users_princing_plan` where `users_princing_plan`.`id_user` = ? and `users_princing_plan`.`id_user` is not null",
"bindings": [
],
"time": 0.8
}
{
"query": "select * from `pricing_plan_limits` where `pricing_plan_limits`.`id_pricing_plan` = ? and `pricing_plan_limits`.`id_pricing_plan` is not null limit 1",
"bindings": [
],
"time": 0.88
}
有没有办法优化这个并以 Eloquent-Way 运行更少的查询?
【问题讨论】:
-
您好!为什么你的 SQL 语句执行时间是 0.96 秒? (似乎太长了)你有什么类型的数据库?您是否为列设置了索引?
-
我已将原始日志替换为不显示任何重要内容。此查询耗时 0.64 秒,数据库使用 INNODB (MySQL) 作为引擎,并在自制的临时本地服务器上运行,仅用于测试目的。 id_user 是主键。
-
如果服务器在 SSD 上,查询时间会更快。
-
我认为你应该为你的模型添加额外的关系。对于
PricingPlanLimits添加pricingPlans()... 都错过了。然后就可以在这个相关模型上使用where方法。 Querying Relations。您也可以只查询您需要的那些列。例如:User::get(['id', 'name']) -
可能我会使用 Eloquent 上的支点来准确表达我的情况,你有所有这些嵌套关系,你可以走一个“捷径”
标签: laravel laravel-5 eloquent