如何获取 Laravel 集合中的下一个项目?

Posted

技术标签:

【中文标题】如何获取 Laravel 集合中的下一个项目?【英文标题】:How do I get the next item in a Laravel collection? 【发布时间】:2015-04-21 16:41:01 【问题描述】:

假设我有一个父集合的孩子,我想知道下一个兄弟姐妹是谁。我的父集合的排序方式与内部 ID 不同,因此我无法使用此处描述的方法:

Laravel previous and next records

除了我按名称和时间而不是内部 id 排序之外,这会起作用。我希望有一种方法可以获取父集合,在其中找到这个孩子的位置,然后在该集合中向前或向后看以获得下一个或上一个。

编辑:

所以,我做了这个,它有效,但看起来很笨重。有没有更有效的方法来做到这一点?

public function next()

    $previous = null;
    foreach ($this->album->media as $media)
    
        if(!empty($previous && $previous->id == $this->id))
        
            // Yay! Our current record  is the 'next' record.
            return $media->id;
        
        $previous = $media;
    
    return null;


public function previous()

    $previous = null;
    foreach ($this->album->media as $media)
    
        if(!empty($previous && $media->id == $this->id))
        
            // Yay! Our previous record is the 'previous' record.
            return $previous;
        
        $previous = $media->id;
    
    return null;

【问题讨论】:

您可以通过按排序条件扩展给定示例的查询。你的收藏是如何分类的?您需要一个 orderBy Condition 排序,它基本上不会更改原始顺序。如果您提供,我相信我们可以提供帮助 @nozzleman 按时间,对于重复的时间,按字母名称。 好的,我猜双阶条件你已经找到了一个好的解决方案。其他解决方案将包括特定于 db-server 的东西,比如我猜的行号。 你为什么不直接使用paginate(1)呢? 不是按键分页的。 【参考方案1】:

您不应该加载整个表格来循环遍历它以查找下一个/上一个项目,而是这样做:

$next = $this->album->media()->orderBy('id')->where('id', '>', $this->id)->first();

【讨论】:

问题表明它们没有按主键排序。【参考方案2】:

这成功了:

public function next()

    $previous = null;
    foreach ($this->album->media as $media)
    
        if(!empty($previous && $previous->id == $this->id))
        
            // Yay! Our current record  is the 'next' record.
            return $media->id;
        
        $previous = $media;
    
    return null;


public function previous()

    $previous = null;
    foreach ($this->album->media as $media)
    
        if(!empty($previous && $media->id == $this->id))
        
            // Yay! Our previous record is the 'previous' record.
            return $previous;
        
        $previous = $media->id;
    
    return null;

【讨论】:

以上是关于如何获取 Laravel 集合中的下一个项目?的主要内容,如果未能解决你的问题,请参考以下文章

laravel中的动态网址?

Laravel,如何将集合对象转换为构建器对象

如何使用 laravel 集合获取最后插入的 ID 并将其插入到第二个表中?

如何获取具有特定 ID 的 div 中的下一个元素

Laravel 5.7:基于多个键检测集合中的重复项(完成)但如何将重复项移动到另一个集合?

如何从 Laravel 的集合中计算不同的值?