laravel5.5,获取下一个/上一个雄辩的模型,按字母顺序排序的“slug”

hjqgdpho  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(391)

我有一个能言善辩的字母数字模型 slug 字段(不是主键)。
我正在实施 getNextAttribute() 以及 getPreviousAttribute() 自定义getter,其目的是:
急切地在按字母顺序排列的记录列表中预加载记录的“邻居” slug ;
预加载 null 如果当前记录在终端位置。
(把它想象成一个字典条目表。它们是按术语排序的,预加载下一个和上一个条目是合乎逻辑的。)
如何最佳地解决这样的问题?也许我已经搞错了?
我没说清楚。
鉴于我们有一个 records 表格:

id      slug
--      ----
1       Tango
2       Alpha
3       Zulu
4       Bravo
5       Zulu
6       Foxtrot

我们走的时候:

$record = App\Record::where('id', 5)->get();

那么我们应该得到:

$this->assertEquals(null, $record->next);
$this->assertEquals(3, $record->previous->id);
kq0g1dla

kq0g1dla1#

我有一个类似的问题,但与数字排序。最后,我提取了所有模型的集合,然后使用first和last函数来获取next和previous。
在您的记录模型中推断您的案例:

protected function siblings(){
    return Records::all()->sortBy('slug')
}

public function next(){
    $next = $this->siblings()->first(function ($value, $key) {
            return $value->slug > $this->slug;
        });
return $next;
}

public function previous(){
    $previous = $this->siblings()->last(function ($value, $key) {
        return $value->sort < $this->sort;
    });
return $previous
}

如果记录是集合中的第一个或最后一个,则自动返回null。

相关问题