优化accesor功能laravel

时间:2019-01-14 22:58:25

标签: php laravel

我有accesor,此函数返回我模型记录的位置顺序:

public function getPositionAttribute()
{
    $n = $this->count();
    for ($i = 0; $i < $n; $i++) {
        $s = $this->get(['id'])->toArray()[$i]['id'];
        if ($s == $this->id) {
            return $i + 1;
        }
    }
}

如何优化此代码?我认为他的工作非常非常缓慢,因为我经历了很多记录。可以使用map函数吗?我试过了,但是地图返回了集合,但是没有数字。我的地图代码:

public function getPositionAttribute()
{
    $this->get(['id'])->map(function($item, $key) {
        if ($item->id == $this->id) {
            return $key + 1;
        }
    });
}

地图函数返回:#[1,NULL]#[NULL,2]等 如何正确执行我的accesor功能?

3 个答案:

答案 0 :(得分:1)

如果我了解您的代码正确执行的操作,则可能会这样:

public function getPositionAttribute()
{
    $collection = $this->all()->pluck('id'); 

    $position = $collection->search($this->id); 

    return $position ? ++$position : 0;

    // 0 means the id could not be found
    // You could easily swap that out with null or false. 
}

答案 1 :(得分:0)

请尝试此操作,让我知道它是否有效...

public function getPositionAttribute()
{
    foreach($this->all()  as $key => $item) {
        if($this->id == item) return $key;
    };
}

请记住集合从0开始,也许您需要在返回$ key之前加1。

答案 2 :(得分:0)

您可以使用分配了较早主键的记录数吗?例如:

create table tbl (t time);
insert into tbl values ("00:06:00"), ("00:03:00"), ("-00:06:00"), ("-00:03:00");
-- here you can see how it works
select *,
       TIMESTAMPDIFF(SECOND, cast(cast("00:05:00" as time) as datetime), cast(t as datetime))
from tbl;