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 相关文章推荐
域名查询代码公布
Oct 09 PHP
BBS(php &amp; mysql)完整版(八)
Oct 09 PHP
PHP新手上路(十一)
Oct 09 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
PHP序列号生成函数和字符串替换函数代码
Jun 07 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 PHP
php中异常处理方法小结
Jan 09 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
Jun 07 PHP
PHP实现动态压缩js与css文件的方法
May 02 PHP
PDO::commit讲解
Jan 27 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
js location.replace与location.reload的区别
2010/09/08 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
英文自荐信
2013/12/19 职场文书
证婚人经典证婚词
2014/01/09 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
党支部活动策划方案
2014/08/18 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
刘胡兰观后感
2015/06/16 职场文书
婚庆答谢词大全
2015/09/29 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书