我不确定这最近是否已经改变,或者我以前从未注意过,但是Eloquent Accessor的响应无论如何都没有保留,这意味着每次都会调用accessor方法。在这个特定的例子中,这导致查询多次不必要。这是一个例子:
<?php
//Career Model
class Career extends Model {
public function seasons()
{
return $this->hasMany('Season', 'career_id');
}
pubic function getSeasonsCountAttribute()
{
return $this->seasons()->count();
}
}
//Season Model
class Season extends Model {
}
//Blade Template
@if($career->seasonsCount)
<div>Seasons Count: {{ $career->seasonsCount }}</div>
@endif
从这一小段代码开始,查询将运行两次,因为$ seasonsCount被访问两次。
选择计数(*)作为来自
seasons
的汇总seasons
。career_id
=&#39; 12316&#39;和seasons
。career_id
不为空选择计数(*)作为来自
seasons
的汇总seasons
。career_id
=&#39; 12316&#39;和seasons
。career_id
不为空
我意识到我可以通过做这两件事之一来避免这种情况:
pubic function getSeasonsCountAttribute()
{
if(is_null($this->seasonsCountCache))
{
$this->seasonsCountCache = $this->seasons()->count();
}
return $this->seasonsCountCache;
}
OR
@if($seasonsCount = $career->seasonsCount)
<div>Seasons Count: {{ $seasonsCount }}</div>
@endif
虽然这些可行,但我想知道Laravel中是否有某种方法可以防止每次都访问它。每次都要求调用函数似乎是一个非常奇怪的设计决定。
答案 0 :(得分:0)
对于我来说,查询构建器的工作方式并不奇怪。
就像你说的那样:&#34;它很奇怪,因为当我这样做时
$careers = Career::all();
$newCareers = Career::all();
它会触发两个查询&#34;
当然它确实如此,您有责任缓存之前已检索过的数据。
使用seasonsCountCache
属性的解决方案似乎很不错。