资讯专栏INFORMATION COLUMN

Laravel 5.4 入门系列 10.文章归档

Nekron / 1140人阅读

摘要:将上述的一系列查询进行封装模型到了这一步,我们基本上实现了文章归档的功能。但是有一个问题,文章归档实际上包括在通用视图中,这就意味着,网站的所有请求都需要返回,否则就会报错。数据库之数据库请求构建器中文文档的视图功能中文文档

首先,要实现的是按照日期来统计文章,原始的 SQL 如下:

select 
    year(created_at)  year,
    monthname(created_at) month,
    count(*) published
from posts
group by year, month
order by min(created_at) desc;

将其转化为 Eloquent Model:

/app/Http/Controllers/PostsController.php
use AppPost;
public function index()
{    

    $archives = Post::selectRaw("year(created_at)  year, monthname(created_at) month, count(*) published")
                    ->groupBy("year","month")
                    ->orderByRaw("min(created_at) desc")
                    ->get();

    $posts = Post::latest()->get();

    return view("posts.index",compact("posts","archives"));
}

视图中显示对应的文章归档:

/resources/views/layouts/siderbar.blade.php
  

用户点击某个月份的时候,向后台传入 monthyear 参数,因此 index 方法还需要根据参数类型来进行选择:

/app/Http/Controllers/PostsController.php
use CarbonCarbon;
public function index()
{    

    $archives = Post::selectRaw("year(created_at)  year, monthname(created_at) month, count(*) published")->groupBy("year","month")->orderByRaw("min(created_at) desc")->get();


    $posts = Post::latest();

    if ($month = request("month")) {
        $posts->whereMonth("created_at",Carbon::parse($month)->month);
    }

    if ($year = request("year")) {
        $posts->whereYear("created_at",$year);
    }

    $posts = $posts->get();

    return view("posts.index",compact("posts","archives"));
}

这里使用了 Laravel 提供的 whereDate 系列方法,同时,月份用 Carbon 进行转换。

将上述的一系列查询进行封装:

/app/Http/Controllers/PostsController.php
public function index()
{    

    $archives = Post::archives();
    $posts = Post::latest()
                ->filter(request(["year","month"]))
                ->get();

    return view("posts.index",compact("posts","archives"));
}

模型:

/app/Post.php
use CarbonCarbon;
public function scopeFilter($query, $value)
{
    if ($month = $value["month"]) {
        $query->whereMonth("created_at", Carbon::parse($month)->month);
    }

    if ($year = $value["year"]) {
        $query->whereYear("created_at", $year);
    }
}

public static function archives()
{
    return static::selectRaw("year(created_at)  year, monthname(created_at) month, count(*) published")
                ->groupBy("year","month")
                ->orderByRaw("min(created_at) desc")
                ->get();
}

到了这一步,我们基本上实现了文章归档的功能。但是有一个问题,文章归档实际上包括在通用视图中,这就意味着,网站的所有请求都需要返回 $archives,否则就会报错。一种做法就是在不同方法下都调用 archives() 方法来返回数据。当然,更为简单的方法就是使用「视图共享数据」功能。操作如下:

/app/Providers/AppServiceProvider.php
public function boot()
{
    Schema::defaultStringLength(191);
    view()->composer("layouts.siderbar",function($view){

        $view->with("archives",AppPost::archives());

    });
}

该服务提供者包含两个方法:register(),用来绑定 IOC 容器(先忽略),绑定完之后,我们就可以在 boot 里面定义我们想要实现的功能了,在该例中,我们注册了 layouts.siderbar 视图,并传递给视图 archives 变量。


Laravel 数据库之:数据库请求构建器 | Laravel 5.4 中文文档

Carbon - A simple PHP API extension for DateTime.

Laravel 的视图功能 | Laravel 5.4 中文文档

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22773.html

相关文章

  • Laravel 5.4 入门系列 7. 文章的显示

    摘要:为的辅助方法,用于截取字符串的前个字符,然后返回前个字符加的格式。显示某篇文章显示某篇文章的比较简单,路由注意要放在下面,假如这样那么,我们访问的时候,会被当成是的查询参数。 文章的显示功能比较简单,分为两部分: 文章列表 具体的某篇文章 显示文章列表 路由之前已经定义好: Route::get(/posts,PostsController@index); 控制器: public ...

    kuangcaibao 评论0 收藏0
  • Laravel 5.4 入门系列 8. 文章评论

    摘要:编辑迁移文件我们为表格添加了外键,同时生定义了约束,该约束允许删除父表文章的时候,自动删除关联的子表评论。关联中文文档的辅助函数列表中文文档 本节将学习 Eloquent Relations,表与表之间存在着多种关系,举例如下: 一对一:文章与作者 一对多:文章与评论 多对多:标签与文章 文章与评论的一对多关系 一对多关系,主要理解两点: 如何实现一对多关系 实现了之后能给开发带...

    IntMain 评论0 收藏0
  • Laravel 5.4 入门系列 6. 文章的创建

    摘要:基本功能创建文章的第一步是用户发请求,然后返回创建文章的页面。实际上,会报错添加保护虽然我们完成了基本功能,但是提交请求的时候还是会报错,其实这是防止攻击。假如违反了规则,错误信息会自动被保存在闪存的中,即只对下一次请求生效。 基本功能 创建文章的第一步是用户发请求,然后返回创建文章的页面。 路由:处理用户「创建文章」的请求 /routes/web.php Route::get(/po...

    levius 评论0 收藏0
  • Laravel 5.4 入门系列 9. 注册与登录,用户关联

    摘要:本节将实现文章评论与用户关联的功能。关系定义首先修改与表,增加字段增加全部回滚并重新执行迁移添加用户表与文章表评论表的一对多关系添加文章评论表与用户表的多对一关系同时,评论表的字段增加。同时,我们还自定义了返回的错误信息。 本节将实现文章、评论与用户关联的功能。 关系定义 首先修改 posts 与 comments 表,增加 user_id 字段 /database/migratio...

    smallStone 评论0 收藏0
  • Laravel 5.4 入门系列 3. 任务列表显示

    摘要:熟悉了路由与视图的基本操作之后,我们来让视图显示一个任务列表吧。创建迁移现在,我们就可以创建一个用来生成任务表的迁移了。 熟悉了路由与视图的基本操作之后,我们来让视图显示一个任务列表吧。主要知识点: 数据迁移 查询构造器 数据库 创建数据库 首先创建一个数据库: $ mysql -uroot -p mysql> create database laratasks; 数据库配置 La...

    SunZhaopeng 评论0 收藏0

发表评论

0条评论

Nekron

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<