Laravel 5框架学习之日期,Mutator 和 Scope


Posted in PHP onApril 08, 2015

在我们前面的解决方案中,直接给 published_at 赋值为当前日期实际上是一个临时解决方案,我们需要设定发布日期,可能是未来2天后才发布,让我们修改这个问题。

首先修改控制器:

public function store() {
    Article::create(Request::all());
    return redirect('articles');
  }

然后修改视图,添加发布日期字段

@extends('layout')

@section('content')
  <h1>Write a New Article</h1>

  <hr/>

  {{--使用我们添加的 illuminate\html 开源库--}}
  {!! Form::open(['url' => 'articles']) !!}
    <div class="form-group">
      {!! Form::label('title', 'Title:') !!}
      {!! Form::text('title', null, ['class' => 'form-control']) !!}
    </div>

    <div class="form-group">
      {!! Form::label('body', 'Body:') !!}
      {!! Form::textarea('body', null, ['class' => 'form-control']) !!}
    </div>

    <div class="form-group">
      {!! Form::label('published_at', 'Publish On:') !!}
      {!! Form::input('date', 'published_at', date('Y-m-d'), ['class' => 'form-control']) !!}
    </div>

    <div class="form-group">
      {!! Form::submit('Add Article', ['class' => 'btn btn-primary form-control']) !!}
    </div>

  {!! Form::close() !!}

@stop

ok,让我们添加一个新的文章,并且把日期设置为未来的某一天,但是文章直接显示在最开始了,这不是我们需要的。我们需要到了那天才显示出来。当然,我们需要更具体一点,比如在早上 8:00 显示,而不是0点显示。我们可以添加一个mutator(也就是其他语言的属性设置器),修改我们的model

<?php namespace App;

use DateTime;
use Illuminate\Database\Eloquent\Model;

class Article extends Model {

 protected $fillable = [
    'title',
    'body',
    'published_at'
  ];

  //属性设置其要遵守格式约定
  // set属性Attribute
  public function setPublishedAtAttribute($date) {
    $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date)->hour(8)->minute(0)->second(0);
  }

}

添加一个新的纪录,查看数据库,我们已经将时间设置正确了,但是我们的首页仍然显示未来的才发布的文章,我们修改它。

public function index() {
    //$articles = Article::latest('published_at')->get();
    $articles = Article::latest('published_at')->where('published_at', '<=', Carbon::now())->get();

    return view('articles.index', compact('articles'));
  }

上面的解决方法可以工作,但是查询语句太长了。我们可以使用 Laravel 提供的 scope ,来简化我们的工作。所谓scope可以理解为是查询过程中使用的中间查询结果,比如我们定义一个published scope,他可以返回所有当前已经发布的文章,让我们修改模型。

//设置scope,遵守命名规则
  public function scopePublished($query) {
    $query->where('published_at', '<=', Carbon::now());
  }

修改控制器使用 scope

public function index() {
    //$articles = Article::latest('published_at')->get();
    //$articles = Article::latest('published_at')->where('published_at', '<=', Carbon::now())->get();
    $articles = Article::latest('published_at')->published()->get();

    return view('articles.index', compact('articles'));
  }

结果相同,但在复杂的查询中我们可以使用scope来分解我们的任务,或者复用查询。

我们来增加一个新的查询,查询所有还没有发布的文章。在模型中添加scope

public function scopeUnpublished($query) {
    $query->where('published_at', '>', Carbon::now());
  }

修改控制器使用unpulished

public function index() {
    //$articles = Article::latest('published_at')->get();
    //$articles = Article::latest('published_at')->where('published_at', '<=', Carbon::now())->get();
    //$articles = Article::latest('published_at')->published()->get();
    $articles = Article::latest('published_at')->Unpublished()->get();

    return view('articles.index', compact('articles'));
  }

one more thing! 如果我们在 show 方法中使用 dd($article->published_at) 查看的结果,与 dd($article->created_at); 结果不一样,前者我们使我们自己的字段,后者是在 CreateArticleTable 中通过 $table->timestamp() 自动生成的。自动生成的字段显示出来是 Carbon类型,而我们的是字符串。使用 Crabon类型有很多的好处,例如你可以输出 dd($article->created_at->diffForHumans()); ,这种 1 hour ago 结果,但我们的published_at 不可以。怎么修改?修改模型,告诉laravel,published_at 是日期即可。

protected $dates = ['published_at'];

再次使用 dd($article->published_at->diffForHumans()); ,结果显示为 3 days from now,Bingo!

以上所述就是本文的全部内容了,希望能够给大家学习Laravel5框架有所帮助。

PHP 相关文章推荐
用php解析html的实现代码
Aug 08 PHP
phpstorm配置Xdebug进行调试PHP教程
Dec 01 PHP
laravel学习教程之关联模型
Jul 30 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
搭建自己的PHP MVC框架详解
Aug 16 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP实现批量修改文件名的方法示例
Sep 18 PHP
php输出形式实例整理
May 05 PHP
php实现断点续传大文件示例代码
Jun 19 PHP
php的对象传值与引用传值代码实例讲解
Feb 26 PHP
Laravel 5框架学习之表单
Apr 08 #PHP
Laravel 5框架学习之模型、控制器、视图基础流程
Apr 08 #PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 #PHP
Laravel 5框架学习之数据库迁移(Migrations)
Apr 08 #PHP
Laravel 5框架学习之环境与配置
Apr 08 #PHP
Laravel 5框架学习之Blade 简介
Apr 08 #PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
Apr 08 #PHP
You might like
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
javascript 打印内容方法小结
2009/11/04 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
2019/03/02 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
打开电脑上的QQ的python代码
2013/02/10 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
Python进程间通信用法实例
2015/06/04 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
详解Python文本操作相关模块
2017/06/22 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
Python多继承顺序实例分析
2018/05/26 Python
Python中logging实例讲解
2019/01/17 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
基于Python中的yield表达式介绍
2019/11/19 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
网络工程专业毕业生推荐信
2013/10/28 职场文书
活动总结范文
2014/08/30 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers