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初学者写及时补给skype用户充话费的小程序
Nov 02 PHP
php mssql 分页SQL语句优化 持续影响
Apr 26 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
PHP 观察者模式的实现代码
May 10 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
php实现的zip文件内容比较类
Sep 24 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
PHP折半(二分)查找算法实例分析
May 12 PHP
PHP abstract 抽象类定义与用法示例
May 29 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
Jan 25 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
小偷PHP+Html+缓存
2006/12/20 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
php实现微信支付之现金红包
2018/05/30 PHP
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
Python实现网站文件的全备份和差异备份
2014/11/30 Python
python变量不能以数字打头详解
2016/07/06 Python
Python单例模式的两种实现方法
2017/08/14 Python
Python工程师面试必备25条知识点
2018/01/17 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
后勤人员岗位职责
2013/12/17 职场文书
大型活动策划方案
2014/01/12 职场文书
品酒会策划方案
2014/05/26 职场文书
Elasticsearch 批量操作
2022/04/19 Python