【问题标题】:How to get the next and previous record using slug in laravel如何在 laravel 中使用 slug 获取下一条和上一条记录
【发布时间】:2021-01-24 23:14:16
【问题描述】:

我正在尝试获取项目中的上一条和下一条记录(如博客文章)。我一直无法获得与每个项目的 slug 相关的 id。

我可以在我的 projectController 中的同一个查询中执行此操作吗?

我可以分配和获取每个项目的 slug,它是根据标题创建的。

::ProjectController


    public function single($slug){
       
        $project = Project::with('tools', 'categories')->where('slug', $slug)->firstOrFail();
        $prev = Project::where('id', '<', $project->id)->orderBy('id','desc')->first();
        $next = Project::where('id', '>', $project->id)->orderBy('id')->first();
        return view('project-single',compact('project',$project))
                    ->with('prev',$prev)
                    ->with('next',$next);
    }

::SingleProject.blade.php

 @if($prev ==! null)
                <a href="{{ route('project.single', ['project' => $prev]) }}" class="animate">

                  <i class="las la-long-arrow-alt-left"></i>Anterior
                </a> 
                @endif  

::Route

Route::get('/proyectos/{slug}', 'ProjectController@single')->name('project.single'); 

【问题讨论】:

    标签: laravel blogs slug


    【解决方案1】:

    这个呢:

    $project = Project::with('tools', 'categories')->where('slug', $slug)->firstOrFail();
     
    
    $more = Project::whereIn('id', [$project->id - 1, $project->id + 1])->get();
    $prev = $more->where('id', '<', $project->id)->first();
    $next = $more->where('id', '>', $project->id)->first();
    

    【讨论】:

    • 如果 id 有空缺怎么办?
    • 当我点击下一个或上一个时,url 是 project/1, project/2。这会返回 404。它应该是 project/some-slug-of-project
    • @Kataldo 这就是在使用 route 帮助器时将模型作为路由参数传递时发生的情况,默认情况下它使用“id”......要么显式传递 slug,要么你需要调整getRouteKeyName 方法以返回'slug' ...这也将使它使用该字段进行隐式路由模型绑定
    【解决方案2】:

    我解决了问题:

    ::projectController
    
     public function single($slug){
            $project = Project::with('tools', 'categories')->where('slug', $slug)->firstOrFail();
            $next = Project::where('id', '>', $project->id)->min('id');
            $prev = Project::where('id', '<', $project->id)->max('id');
            
            return view('project-single',compact('project',$project))
                        ->with('prev',Project::find($prev))
                        ->with('next',Project::find($next));
        }
    
    
    :::view
    
     @if($prev ==! null)
                    <a href="{{ route('project.single', ['slug' => $prev->slug]) }}" class="animate">
    
                      <i class="las la-long-arrow-alt-left"></i>Anterior
                    </a> 
                    @endif 
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      相关资源
      最近更新 更多