我有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功能?
答案 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;