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 相关文章推荐
杏林同学录(九)
Oct 09 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
深入array multisort排序原理的详解
Jun 18 PHP
php获取一个变量的名字的方法
Sep 05 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
PHP安装memcached扩展笔记
May 28 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
微信第三方登录(原生)demo【必看篇】
May 26 PHP
PHP小白必须要知道的php基础知识(超实用)
Oct 10 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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&amp;MYSQL分页原理及实现
2007/01/02 PHP
MYSQL环境变量设置方法
2007/01/15 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php树型类实例
2014/12/05 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
xtree.js 代码
2007/03/13 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
微信小程序 选项卡的简单实例
2017/05/24 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
jQuery中event.target和this的区别详解
2020/08/13 jQuery
Vue 实现拨打电话操作
2020/11/16 Javascript
python根据京东商品url获取产品价格
2015/08/09 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python 操作MySQL详解及实例
2017/04/30 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
毕业生造价工程师求职信
2013/10/17 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
贷款担保申请书
2014/05/20 职场文书
企业消防安全责任书
2014/07/23 职场文书
申请吧主发表的感言
2015/08/03 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis