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实现读取和编写XML DOM代码
Apr 07 PHP
php 无限级数据JSON格式及JS解析
Jul 17 PHP
PHP include_path设置技巧分享
Jul 03 PHP
PHP警告Cannot use a scalar value as an array的解决方法
Jan 11 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
PHP模块memcached使用指南
Dec 08 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 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 数组教程 定义数组
2009/10/23 PHP
php析构函数的简单使用说明
2015/08/24 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
Python通过解析网页实现看报程序的方法
2014/08/04 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
详解python中的闭包
2020/09/07 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
数控专业自荐书范文
2014/03/16 职场文书
作风建设演讲稿
2014/05/23 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
2015年保送生自荐信
2015/03/24 职场文书
2019中小学生安全过暑期倡议书
2019/06/24 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
利用js实现简单开关灯代码
2021/11/23 Javascript
Win11筛选键导致键盘失灵怎么解决? Win11关闭筛选键的技巧
2022/04/08 数码科技