Laravel Eloquent:保存访问者响应

时间:2015-09-09 15:08:08

标签: laravel laravel-5 eloquent

我不确定这最近是否已经改变,或者我以前从未注意过,但是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的汇总seasonscareer_id =&#39; 12316&#39;和seasonscareer_id不为空

     

选择计数(*)作为来自seasons的汇总seasonscareer_id =&#39; 12316&#39;和seasonscareer_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中是否有某种方法可以防止每次都访问它。每次都要求调用函数似乎是一个非常奇怪的设计决定。

1 个答案:

答案 0 :(得分:0)

对于我来说,查询构建器的工作方式并不奇怪。

就像你说的那样:&#34;它很奇怪,因为当我这样做时

$careers = Career::all();
$newCareers = Career::all();

它会触发两个查询&#34;

当然它确实如此,您有责任缓存之前已检索过的数据。

使用seasonsCountCache属性的解决方案似乎很不错。