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 随机生成10位字符代码
Mar 26 PHP
Zend framework处理一个http请求的流程分析
Feb 08 PHP
php数组对百万数据进行排除重复数据的实现代码
Jun 08 PHP
paypal即时到账php实现代码
Nov 28 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
php给每个段落添加空格的方法
Mar 20 PHP
适用于初学者的简易PHP文件上传类
Oct 29 PHP
使用php实现从身份证中提取生日
May 09 PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 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生成便于打印的网页
2006/10/09 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
PHP的反射机制实例详解
2017/03/29 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
jquery tab插件制作实现代码
2010/06/22 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
Python SQLite3数据库操作类分享
2014/06/10 Python
列举Python中吸引人的一些特性
2015/04/09 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
python3爬虫之设计签名小程序
2018/06/19 Python
python requests 测试代理ip是否生效
2018/07/25 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Django CBV类的用法详解
2019/07/26 Python
python 伯努利分布详解
2020/02/25 Python
python如何写try语句
2020/07/14 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
驾驶员岗位职责
2014/01/29 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
国博复兴之路观后感
2015/06/02 职场文书
Redis持久化与主从复制的实践
2021/04/27 Redis
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
Redis特殊数据类型bitmap位图
2022/06/01 Redis