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 相关文章推荐
第十四节 命名空间 [14]
Oct 09 PHP
php公用函数列表[正则]
Feb 22 PHP
php 什么是PEAR?(第三篇)
Mar 19 PHP
php使用curl访问https示例分享
Jan 17 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
Jan 07 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
TP5框架实现签到功能的方法分析
Apr 05 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
单位速度在实战中的运用
2020/03/04 星际争霸
PHP通过COM使用ADODB的简单例子
2006/12/31 PHP
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
Pytorch之Variable的用法
2019/12/31 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
人事专员的职责
2014/02/26 职场文书
师范生自我鉴定
2014/03/20 职场文书
竞选文艺委员演讲稿
2014/04/28 职场文书
关于爱国的标语
2014/06/24 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书