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 获取MySQL数据库里所有表的实现代码
Jul 13 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
php通过session防url攻击方法
Dec 10 PHP
php返回当前日期或者指定日期是周几
May 21 PHP
php实现CSV文件导入和导出
Oct 24 PHP
win7安装php框架Yii的方法
Jan 25 PHP
laravel5.2实现区分前后台用户登录的方法
Jan 11 PHP
php使用curl实现简单模拟提交表单功能
May 15 PHP
PHP获取远程http或ftp文件的md5值的方法
Apr 15 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
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
javascript折半查找详解
2015/01/26 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
详解django自定义中间件处理
2018/11/21 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
pandas 时间格式转换的实现
2019/07/06 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
学期研究性学习个人的自我评价
2014/01/09 职场文书
出纳员岗位责任制
2014/02/11 职场文书
大型公益活动策划方案
2014/08/20 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
走近毛泽东观后感
2015/06/04 职场文书
小学运动会前导词
2015/07/20 职场文书
文明上网主题班会
2015/08/14 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
Python进行区间取值案例讲解
2021/08/02 Python