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函数
Oct 09 PHP
关于BIG5-HKSCS的解决方法
Mar 20 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
php for 循环语句使用方法详细说明
May 09 PHP
提高PHP编程效率的方法
Nov 07 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
Aug 20 PHP
php eval函数一句话木马代码
May 21 PHP
PHP中phar包的使用教程
Jun 14 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 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一个文件搞定微信jssdk配置
2016/12/12 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
php测试kafka项目示例
2020/02/06 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
Python中的迭代器漫谈
2015/02/03 Python
Python使用minidom读写xml的方法
2015/06/03 Python
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
Python os库常用操作代码汇总
2020/11/03 Python
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
报名委托书
2015/01/29 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS