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

tiếp đến gõ lệnh

để 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 :

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 :

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

để 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 :

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 :

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 :

Đ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ý.

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 :

Ở đ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 :

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)

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

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 :

Ở 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 :

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

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 :

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:

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 :

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

để 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à:

còn nội dung :

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 !

 

Bài 9 : Xử lý ngày tháng trong Laravel 5
Đánh giá bài viết
Mình là Hiếu. Mình lập ra Kungfu PHP nhằm mục đích chia sẽ những gì mình biết đến với các bạn bao gồm các lĩnh vực như : tiền điện tử, kiếm tiền online, marketing, lập trình... Hy vọng nơi đây là mái nhà chung để chúng ta có thể học tập và trao đổi với nhau, cùng nhau phát triển. Chúc các bạn luôn vui !
Bạn có muốn tham gia nhóm thảo luận ICO tốt nhất ?

14 Comments Already

  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.

    • unset no di

    • 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

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 *

loading...