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 相关文章推荐
mac下使用brew配置环境的步骤分享
May 23 PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 PHP
php class中self,parent,this的区别以及实例介绍
Apr 24 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
php实现的mongodb操作类实例
Apr 03 PHP
PHP浮点数精度问题汇总
May 13 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
Mar 25 PHP
Yii控制器中filter过滤器用法分析
Jul 15 PHP
phpcms中的评论样式修改方法
Oct 21 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
Oct 21 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
NOT NULL 和NULL
2007/01/15 PHP
php模板函数 正则实现代码
2012/10/15 PHP
深入apache host的配置详解
2013/06/09 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
python中随机函数random用法实例
2015/04/30 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
python中自带的三个装饰器的实现
2019/11/08 Python
python队列原理及实现方法示例
2019/11/27 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
python实现图片素描效果
2020/09/26 Python
销售文员的岗位职责
2013/11/20 职场文书
高三政治教学反思
2014/02/06 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
python爬虫框架feapde的使用简介
2021/04/20 Python
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL