học laravel 5

Bài 9 : Xử lý ngày tháng trong Laravel 5

Halo, trước tiên cho mình xin lỗi các bạn vì ra bài viết tiếp theo trong loạt bài Laravel 5 khá chậm trễ, lý do là dạo gần đây mình bận khá nhiều công việc.

Hôm nay, tiếp theo bài viết Form trong Laravel 5,  mình sẽ giới thiệu đến các bạn cách xử lý ngày tháng trong Laravel 5.

Như các bạn đã biết thì bất kỳ một bài viết nào đó khi đã được xuất bản thì cần phải lưu lại thời gian mà nó được tạo ra. Cũng giống như chúng ta khi sinh ra thì phải có ngày sinh nhật vậy đó 🙂

Trong suốt bài viết về chủ đề Xử lý ngày tháng trong Laravel 5 mình sử dụng lại form articles đã được tạo ra ở bài viết trước Form trong Laravel 5 để các bạn dễ hình dung. Ok, vào vấn đề chính nào !

Xử lý ngày tháng trong Laravel 5

1. Khởi chạy Laravel 5

Việc đầu tiên cần làm là chúng ta phải khởi chạy Laravel 5 cái đã. Mở cmd, gõ lệnh sau để di chuyển vào thư mục gốc của Laravel 5

cd C:/wamp/www/laravel-5

tiếp đến gõ lệnh

php artisan serve

để khởi chạy laravel 5 ở port 8000

2. Thêm field input date trong form

Coi lại 1 chút về form mà chúng ta đã tạo ra ở bài trước trong file view create.blade.php có nội dung :

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Form trong Laravel 5</title>
</head>
<body>
	<h1>Them Bai Viet Moi</h1>
	{!! Form::open() !!}
		{!! Form::label('name','Name:') !!}
		{!! Form::text('name') !!} <br />

		{!! Form::label('author','Author:') !!}
		{!! Form::text('author') !!} </br>

		{!! Form::submit('Them moi')!!}
	{!! Form::close() !!}
</body>
</html>

Hiện tại thì trong form này chỉ có 2 input để người dùng nhập thông tin đó là name và author. Vì thế mình sẽ tiếp tục thêm 1 input kiểu date mới để người dùng nhập ngày tháng như sau :

{!! Form::label('created_at','Created Date:') !!}
{!! Form::input('date', 'created_at') !!} <br />

Các bạn lưu ý là ‘created_at’ chính là tên của column created_at thuộc bảng articles trong Database. Các bạn nhớ đặt tên cho chính xác, vì như vậy laravel mới có thể hiểu được và xử lý giá trị này.

Tiếp đến các bạn gõ đường dẫn

localhost:8000/articles/create

để vào lại form mà chúng ta đã tạo thì các bạn sẽ thấy như sau :

form xử lý ngày tháng trong laravel 5
form xử lý ngày tháng trong laravel 5

Ở hình trên, 1 field mới được tạo ra là Created Date có định dạng là dd/mm/yyyy, fieal này dùng để cho các bạn nhập ngày tháng năm của articles. Nếu như các bạn không muốn hiển thị dd/mm/yyyy vì cảm giacs nó kì kì thì các bạn sửa lại file view create.blade.php một xíu ở field date như sau :

{!! Form::label('created_at','Created Date:') !!}
{!! Form::input('date', 'created_at', date("Y-m-d")) !!} <br />

Với đoạn code trên, mình đã format lại ngày tháng năm bằng cách truyền thêm date(“Y-m-d”) vào trong input date vừa tạo. Tiếp đến, reload lại trình duyệt thì các bạn sẽ thấy mặc định thời điểm ngày hôm nay được điền sẵn như sau :

Gợi ý : Bạn là người mới và muốn tìm hiểu về Bitcoin nhưng không biết bắt đầu từ đâu? Click xem ngay Hướng Dẫn Đầu Tư Bitcoin Cho Người Mới nhé!

form xử lý ngày tháng laravel 5
form xử lý ngày tháng trong laravel 5

3. Sửa ArticlesController.php để xử lý ngày tháng năm

Sau khi đã sửa lại view hiển thị, tiếp đến mình sẽ chỉnh sửa lại file controller ArticlesController.php.

Các bạn mở file ArticlesController.php mà chúng ta đã tạo ra ở các bài trước với function store() có nội dung như sau :

public function store(Request $request){
  		$dulieu_tu_input = $request->all();

  		//Gọi model Articles.php đã được tạo ra ở các bài trước
		  $articles = new Articles;

		  //Lấy thông tin từ các input đưa vào thuộc tính name, author
                  //trong model Articles
  		$articles->name = $dulieu_tu_input["name"];
  		$articles->author = $dulieu_tu_input["author"];

		  //Tiến hành lưu dữ liệu vào database
  		$articles->save();

  		//Sau khi đã lưu xong, tiến hành chuyển hướng tới route articles
                //hiển thị toàn bộ thông tin bảng articles trong database đã được tạo ở các bài trước
		  return redirect('articles');
	}

Đoạn code trên là cách viết thủ công mà ở bài trước Form trong Laravel 5 mình đã giới thiệu đến các bạn. Giờ thì mình sẽ chỉnh sửa lại nội dụng function store() này ngắn gọn hơn, thuận tiện hơn cho chúng ta trong quá trình xử lý.

	public function store(Request $request){
                  // lấy dữ liệu từ form
		  $dulieu_tu_input = $request->all();

                  //dùng hàm create của laravel 5 để đưa hết thông tin lấy từ input và lưu vào trong database
		  Articles::create($dulieu_tu_input);

                  // chuyển hướng người dùng đến trang hiển thị danh sách bài viết
		  return redirect('articles');
	}

Giai thích một tí đó là ở đoạn code mới trên, mình đã lấy hết dữ liệu được gửi từ form và đưa toàn bộ các thông tin vào hàm create() trong Laravel 5, hàm này sẽ chịu trách nhiệm lưu tất cả thông tin vào database mà chúng ta không cần phải làm thủ công như bài trước.

4. Sửa file model Articles.php

Sau khi đã chỉnh sửa xong controller, tiếp đến mình sẽ sửa lại file model Articles.php bằng cách thêm đoạn code như dưới đây :

<?php namespace App;

use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
class Articles extends Model {

	protected $fillable = [
		'author',
		'name',
		'created_at'
	];

}

Ở đoạn code trên, mình đã thêm 1 mảng là $fillable với các giá trị là author, name, created_at. Mảng này có trách nhiệm nói cho Laravel biết là chúng ta sẽ lọc những giá trị này và lưu vào database.

5. Sửa file view articles.blade.php

Tại file view articles.blade.php đã tạo ở bài trước có nội dung như sau :

<html>
<head>
	<title>View articles</title>
</head>
<body>
	<ul>
	@foreach($articles as $article)
		<li>Name : {{$article->name}} | Author : {{$article->author}} </li>
	@endforeach
	</ul>
</body>
</html>

Các bạn sửa lại một chút như dưới đây để hiển thị thời gian bài viết được xuất bản (created_at)

<html>
<head>
	<title>View articles</title>
</head>
<body>
	<ul>
	@foreach($articles as $article)
		<li>Name : {{$article->name}} | Author : {{$article->author}} | {{$article->created_at}}</li>
	@endforeach
	</ul>
</body>
</html>

Tiếp đến, vào trình duyệt, gõ đường dẫn dưới đây để hiển thị form

localhost:8000/articles/create

và điền đầy đủ thông tin vào form như sau :

form xử lý ngày tháng năm laravel 5

Sau khi đã điền thông tin xong, ấn nút Them moi, dữ liệu sẽ được lưu vào database vào và được chuyển hướng hiển thị ra view articles như sau :

Name : Hieu | Author : Kungfu PHP | 2015-03-28 00:00:00

Ở trên, nếu tinh ý bạn sẽ thấy 1 vấn đề nho nhỏ đó là định dạng ngày tháng của chúng ta có giờ phút giây là 00:00:00. Vì Laravel mặc định sẽ lấy thời gian lúc nửa đêm  lưu vào DB. Vì thế để Laravel lưu vào giờ phút giây hiện tại khi bài viết được xuất bản thì bạn mở file model Articles.php và thêm 1 function mới gọi là setCreatedAtAttribute như sau :

<?php namespace App;

use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
class Articles extends Model {

	protected $fillable = [
		'author',
		'name',
		'created_at'
	];
	public function setCreatedAtAttribute($date){
  //format lại $date được gửi vào từ form
  		$this->attributes['created_at'] = Carbon::createFromFormat('Y-m-d',$date);
	}

}

Các bạn lưu ý là tên function setCreatedAtAttribute là hàm được viết theo coding convention theo cú pháp :

set +  field trong database + Attribute

với :

  • set : là mặc định
  • field trong database : ở đây là created_at nhưng bạn phải in đâm chữ cái đầu tiên và bỏ dấu gach ngang “_” đi để nó trở thành CreatedAt
  • Attribute : là mặc định

Trong function setCreatedAtAttribute, mình dùng phương thức Carbon::createFromFormat() để format lại định dang thời gian và lưu dữ liệu vào field created_at.

Sau đó, lưu lại trình duyệt, điền đầy đủ thông tin, ấn Them moi, thì các bạn sẽ thấy dữ liệu được hiển thị ra với ngày tháng lấy theo giờ hiện tại như mong muốn :

Name : Hieu | Author : Kungfu PHP | 2015-03-28 04:16:42

6. Ngoài lề 1 tí

Giả sử như bây giờ chúng ta muốn tạo 1 bài viết, nhưng không muốn nó hiển thị ra vào ngày mà nó được xuất bản (chẳng hạn ở đầy là 28/03/2015) mà mình muốn bài viết sẽ được hiển thị vào ngày mai (tức là ngày 29/03/2015) nên mình sẽ điền thông tin trong form như sau :

laravel 5 xử lý ngày tháng năm

Ấn Them moi thì ta sẽ thấy dữ liệu hiển thị ra ngoài như sau:

Name : Hieu | Author : Kungfu PHP | 2015-03-28 04:16:42
Name : Hieu | Author : Kungfu PHP | 2015-03-28 00:00:00
Name : Hieu | Author : Kungfu PHP | 2015-03-29 04:35:49

Các bạn sẽ thấy rằng bài viết ngày 29/03/2015 vẫn bị hiển thị ra ngoài không đúng như ý muốn của chúng ta. Vì thế

tiếp đến mình sẽ chỉnh sửa lại function index() trong file ArticlesController.php có nội dung :

public function index(){
  //code cũ, lấy hết danh sách bài viết
  $articles = Articles::all();
 
  return view("articles")->with("articles", $articles);
}

trở thành như dưới đây :

public function index(){
  //code mới, chỉ lấy các bài viết từ thời điểm hiện tại trở về trước
  $articles = Articles::latest('created_at')->where('created_at', '<=', Carbon::now())->get();

  return view("articles")->with("articles", $articles);
}

để chỉ lấy các bài viết tính từ thời điểm hiện tại trở về trước. Sau đó, các bạn reload lại trình duyệt sẽ thấy chỉ có 2 bài viết được hiển thị ra là:

Name : Hieu | Author : Kungfu PHP | 2015-03-28 04:16:42
Name : Hieu | Author : Kungfu PHP | 2015-03-28 00:00:00

còn nội dung :

Name : Hieu | Author : Kungfu PHP | 2015-03-29 04:35:49

sẽ được public hiển thị ra ngoài vào ngày mai (29-03-2015).

Mình kết thúc bài viết xử lý ngày tháng trong laravel 5 ở đây. Chúc các bạn 1 ngày cuối tuần thật yên bình và thư giãn. Đừng quên ấn các nút bên dưới bài viết để share cho các bạn khác cùng học. Hoặc ấn Đăng ký nhận bài viết mới ở thanh sidebar bên trái để nhận các bài viết qua email nhé. Thân !

 

Có ích

học laravel 5

Bài 20: Phân trang trong Laravel 5

Phân trang trong laravel 5 (Pagination) là một tính năng rất quan trọng với nhiều …

14 bình luận

  1. Sao in giờ nó bị sai nhỉ. Mình thêm bài viết lúc 20h nó lại cứ ra 13h ???

  2. Bạn ơi nếu trong cơ sở dữ liệu lưu ngày với định dạng yyyy/mm/dd nhưng muốn in ra trình duyệt dạng dd/mm/yyyy thì laravel có hàm nào hỗ trợ ko?

  3. bài viết của bạn hay quá, bạn có thể làm thêm một tuts về cài đặt package socialite không? thanks

  4. em muốn tạo xong cái articles thì nó tự động lưu created_at là lúc mình thêm thì sao hả a?

  5. Tại sao lại phải khởi tao server: php artisan serve trước khi chạy nhỉ ? xampp hay wampp vẫn chạy bình thường mà

  6. cho mình hỏi, sau khi mình dùng model sử dụng create() để đưa dữ liệu vào nhưng trong database chỉ lưu dữ liệu rỗng. Thanks

  7. Articles::create($dulieu_tu_input);
    or
    Articles::update($request->all());

    Khi em dùng hàm ở trên thì gặp lỗi: MassAssignmentException in Model.php line 421: _token(hoặc _method)

    theo em hiểu là do $request->all() tự get về ‘_method’ và ‘_token’ và check trong model Articles ( không có 2 cột này) nên bị lỗi. Fix = cách nào anh biết ko.

    Em dùng $article->name=$request->name;….. save(); thì chạy ok.

    • Bạn đã khai báo “protected $fillable” trong file model Articles.php chưa? Nếu dùng hàm create() thì bắt buộc phải làm việc này vì hàm create() sẽ đưa toàn bộ dữ liệu vào DB tương ứng với các trường mà bạn đã khai báo trong $filtable. Tiếp theo, mở file AriclesController ra, sửa dòng “use Illuminate\Http\Request;” thành “use Request;” .Lưu lại , thế là chạy OK

  8. $articles = Articles::latest(‘created_at’)->where(‘created_at’, ‘get();

    anh ơi, hàm “::latest” này ở đâu vậy, em làm không được nhỉ, bị báo lỗi ko tìm thấy hàm. em thử cả “::lastest” và “::latest” đều ko được luôn

  9. anh viết nhanh nhanh nhiều bài lên.chờ mãi ko được 1 bài

  10. php artisan serve
    chứ hông phải
    php artisan server
    ^^

Trả lời Tran.Duy Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *