mam następujące modele: tektura, użytkownik, UserPricingPlans, PricingPlanLimitswymowny Relacje Optymalizacja zapytań
Uwaga: nie przeszkadza, jeśli coś jest nie tak z modeli code.They działają bez zarzutu.
Tektura
class CardBoard extends Model{
public function user(){
return $this->belongsTo('Models\User','id_user');
}
}
użytkownika
class User extends Model{
public function pricingPlans(){
return $this->hasMany('Models\UserPricingPlan','id_user');
}
}
PricingPlan
class PricingPlan extends Model{
public function limits(){
return $this->hasOne('Models\PricingPlanLimits','id_pricing_plan','id_pricing_plan');
}
}
CenyPlan Limit
Nie opiszę tego modelu, nie jest on niezbędny do rozwiązania problemu. Należy jednak pamiętać, że istnieje atrybut o nazwie maxBoards.
Problem polega na tym, że mam tylko Tektura modelu wystąpienie do pracy i chcę dostać maxBoard atrybut z PricingPlanLImits. Zrobiłem to tak:
Uwaga: Mam już tutaj instancję modelu CardBoard! powyżej
$maxBoard = $cardBoard->user->pricingPlans->last()->limits->maxBoard;
return $maxBoard;
Kod działa świetnie, ale liczba zapytań generowanych przez tę operację jest napowietrznych do mnie. Wymyślne wywołanie SELECT dla nazwanych i nie chcę wszystkich tych danych i operacji.
{
"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
}
Nie ma sposobu na optmizację tego i uruchamianie mniejszej liczby zapytań w trybie Eloquent-Way?
Witam! Dlaczego twoje instrukcje SQL są wykonywane w 0,96 sekundy? (wydaje się zbyt długi) Jaki typ bazy danych posiadasz? Czy skonfigurowałeś indeksy swoich kolumn? – YanDatsyuk
Wymieniłem oryginalny dziennik, aby nie pokazywał niczego ważnego. Ta kwerenda trwa 0,64 s, baza danych używa INNODB (MySQL) jako Engine i działa na lokalnym improwizowanym lokalnym serwerze tylko do celów testowych. id_user jest kluczem podstawowym. –
Jeśli serwer był na dysku SSD, czas zapytania byłby szybszy. –