text: -- phpMyAdmin SQL Dump
  -- version 4.7.4
  -- https://www.phpmyadmin.net/
  --
  -- Máy chủ: 127.0.0.1
  -- Thời gian đã tạo: Th10 17, 2018 lúc 09:57 AM
  -- Phiên bản máy phục vụ: 10.1.28-MariaDB
  -- Phiên bản PHP: 7.1.11
  
  SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  SET AUTOCOMMIT = 0;
  START TRANSACTION;
  SET time_zone = "+00:00";
  
  
  /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  /*!40101 SET NAMES utf8mb4 */;
  
  --
  -- Cơ sở dữ liệu: `itsme`
  --
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `category`
  --
  
  CREATE TABLE `category` (
    `id_cat` int(11) NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `sort` int(11) NOT NULL DEFAULT '500',
    `parent_id` int(11) NOT NULL DEFAULT '0'
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `category`
  --
  
  INSERT INTO `category` (`id_cat`, `name`, `sort`, `parent_id`) VALUES
  (1, 'HTML', 500, 0),
  (2, 'HTML5', 500, 1),
  (3, 'PHP', 500, 0),
  (6, 'LARAVEL', 500, 0),
  (7, 'Other', 800, 6),
  (8, 'Model', 500, 6),
  (9, 'Libraries of Laravel', 790, 6),
  (10, 'Route', 100, 6),
  (11, 'Event', 600, 6),
  (12, 'Form validation', 700, 6),
  (13, 'Vue.js', 500, 0),
  (14, 'JAVASCRIPT', 500, 0),
  (15, 'Other', 500, 14),
  (16, 'Jquery', 500, 14),
  (17, 'Auth', 500, 6),
  (18, 'Khác', 600, 0),
  (19, 'Fb', 500, 18),
  (20, 'Cơ sở dữ liệu', 500, 0),
  (21, 'MySql', 500, 20),
  (22, 'View', 500, 6);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `comment`
  --
  
  CREATE TABLE `comment` (
    `id_cmt` int(11) NOT NULL,
    `id_news` int(11) NOT NULL,
    `content` text COLLATE utf8_unicode_ci NOT NULL,
    `confirm` tinyint(11) NOT NULL,
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
    `name` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
    `email` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
    `idcmtrt` int(11) NOT NULL,
    `namert` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
    `id` int(11) NOT NULL DEFAULT '0'
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `contact`
  --
  
  CREATE TABLE `contact` (
    `id_ct` int(11) NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `phone` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `content` text COLLATE utf8_unicode_ci NOT NULL,
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `contact`
  --
  
  INSERT INTO `contact` (`id_ct`, `name`, `email`, `phone`, `content`, `created_at`, `updated_at`) VALUES
  (1, 'dsd', 'mrnjnhn@yahoo.com.vn', '1232323213', 'dsds', '2018-08-30 00:11:07', '2018-08-30 00:11:07');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `cv`
  --
  
  CREATE TABLE `cv` (
    `id` int(11) NOT NULL,
    `link` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `file_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `lang` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'vi'
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `cv`
  --
  
  INSERT INTO `cv` (`id`, `link`, `file_name`, `lang`) VALUES
  (1, 'https://www.youtube.com', 'cv_vi.pdf', 'vi'),
  (2, 'https://www.facebook.com/', 'cv_en.pdf', 'en');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `experiences`
  --
  
  CREATE TABLE `experiences` (
    `id_exp` int(11) NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `content` text COLLATE utf8_unicode_ci NOT NULL,
    `date_create` date NOT NULL,
    `type` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `language_code` varchar(11) COLLATE utf8_unicode_ci DEFAULT 'vi',
    `address` varchar(100) COLLATE utf8_unicode_ci NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `experiences`
  --
  
  INSERT INTO `experiences` (`id_exp`, `name`, `content`, `date_create`, `type`, `language_code`, `address`) VALUES
  (1, 'Đại Học Bách Khoa Đà Nẵng', 'Sinh viên trường ĐH Bách Khoa Đà Nẵng', '2012-09-02', 'education', 'vi', 'Đà Nẵng'),
  (2, 'Trung Tâm đào tạo lập trình viên VinaENTER', 'Học Lập trình PHP với Laravel FrameWork tại Trung Tâm đào tạo lập trình viên VinaENTER', '2017-10-17', 'education', 'vi', 'Đà Nẵng'),
  (3, 'Công ty giải pháp công nghệ VinaENTER', 'Web Developer tại Công ty giải pháp công nghệ VinaENTER', '2018-02-26', 'work', 'vi', 'Đà Nẵng'),
  (4, 'Danang University of Technology', 'Student of Danang University of Technology', '2012-09-02', 'education', 'en', 'Danang'),
  (5, 'VinaENTER Programmer Training Center', 'Learn PHP Programming with Laravel FrameWork at the VinaENTER Developer Training Center', '2017-10-17', 'education', 'en', 'Danang'),
  (6, 'VinaENTER Technology Solutions Company', 'Web Developer at VinaENTER Technology Solutions Company', '2018-02-26', 'work', 'en', 'Danang'),
  (7, 'Trung Tâm đào tạo lập trình viên VinaENTER', 'Giảng viên PHP với Laravel FrameWork', '2018-05-01', 'work', 'vi', 'Đà Nẵng'),
  (8, 'VinaENTER Programmer Training Center', 'Trainers PHP with the Laravel FrameWork', '2018-05-01', 'work', 'en', 'danang');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `gallery`
  --
  
  CREATE TABLE `gallery` (
    `gallery_id` int(11) NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `gallery`
  --
  
  INSERT INTO `gallery` (`gallery_id`, `name`) VALUES
  (1, 'Vinaenter');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `groups`
  --
  
  CREATE TABLE `groups` (
    `id_group` int(11) NOT NULL,
    `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `code` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT ''
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `groups`
  --
  
  INSERT INTO `groups` (`id_group`, `name`, `code`) VALUES
  (8, 'admin', 'admin'),
  (10, 'CTV', 'ctv');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `images`
  --
  
  CREATE TABLE `images` (
    `img_id` int(11) NOT NULL,
    `image` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `gallery_id` int(11) NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `images`
  --
  
  INSERT INTO `images` (`img_id`, `image`, `gallery_id`) VALUES
  (1, 'khZBNxG2RWtHjZoJcZ62SKVJk5I9zPglllAVvAvq.jpeg', 1),
  (2, 'j4hQM49K3JoXQGo22jpe8SuDVbsn9ZQhkAzVVN8B.jpeg', 1),
  (3, '9LAfmdE3RVSZOMXt1qvfi3zqrvZeE30NTtDEWnhn.jpeg', 1),
  (4, 'WrhjZ5SBcUvt75urPYWEv07wddbAq4sUGuVfk8o1.jpeg', 1),
  (5, 'bOsGk85QWZKnUzZPj36iCqsPizl59ZaFfe67f37v.jpeg', 1),
  (6, 'j3OxDM2MonP7SkimAPxCEhcVaVwoQ8IAykPNC5LP.jpeg', 1),
  (7, 'tmqZikSsZo2QVpSr2mOX00Vvgdqiu01qrg6hkkWW.jpeg', 1);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `migrations`
  --
  
  CREATE TABLE `migrations` (
    `id` int(10) UNSIGNED NOT NULL,
    `migration` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    `batch` int(11) NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `migrations`
  --
  
  INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES
  (1, '2014_10_12_000000_create_users_table', 1),
  (2, '2014_10_12_100000_create_password_resets_table', 1),
  (3, '2018_04_20_205044_create_user_activations_table', 2);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `myinfo`
  --
  
  CREATE TABLE `myinfo` (
    `id_if` int(11) NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `birthday` date NOT NULL,
    `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `address` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `phone` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `content` text COLLATE utf8_unicode_ci NOT NULL,
    `confirm` tinyint(4) NOT NULL DEFAULT '1',
    `fb` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
    `tt` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
    `gg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
    `ig` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
    `avatar` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `picture` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `language_code` varchar(11) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'vi'
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `myinfo`
  --
  
  INSERT INTO `myinfo` (`id_if`, `name`, `birthday`, `email`, `address`, `phone`, `content`, `confirm`, `fb`, `tt`, `gg`, `ig`, `avatar`, `picture`, `language_code`) VALUES
  (1, 'Ninh Văn Nghĩa', '1994-12-22', 'ninhnghia2@gmail.com', 'Đà Nẵng', '0974155708', 'Tôi từng theo học ngành kĩ thuật công trình xây dựng Đại học Bách khoa Đà Nẵng. Cơ duyên đến với IT khi vô tình biết đến trung tâm đào tạo lập trình viên VinaENTER. Mong muốn trở thành một Web Developer.Hãy cùng tìm hiểu con đường đến với IT của tôi nhé!', 1, 'https://www.facebook.com/ninh.nguyen.988711', NULL, NULL, NULL, '4Y3T5Ydoa30V4dNvsfsLJTdOCGcl2dBXcBOpaUOc.jpeg', 'L3rktCvw5sWPFjtnoKgpDsPh2S70bLlL39bmGc7H.jpeg', 'vi'),
  (2, 'Ninh Văn Nghĩa', '1994-12-22', 'ninhnghia2@gmail.com', 'danang', '0974155708', 'I studied engineering in construction of Danang University of Technology. The charm comes to IT when accidentally learned VinaENTER programmer training center. Desire to become a Web Developer. Find out the path to my IT.', 1, 'https://www.facebook.com/ninh.nguyen.988711', NULL, NULL, NULL, 'WgTOyfEoGVezMK8g1V2UNRDqeiUmnBPT2iricXfR.jpeg', 'cfgfxbfkrtcdh87jC7XB17WIgLdVn4z5OadnvIim.jpeg', 'en');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `news`
  --
  
  CREATE TABLE `news` (
    `id_news` int(11) NOT NULL,
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `preview_text` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `detail_text` text COLLATE utf8_unicode_ci NOT NULL,
    `id_cat` int(11) NOT NULL,
    `picture` varchar(100) COLLATE utf8_unicode_ci DEFAULT '',
    `count_number` int(11) NOT NULL,
    `confirm` tinyint(4) NOT NULL,
    `id` int(11) NOT NULL,
    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `keyword` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `news`
  --
  
  INSERT INTO `news` (`id_news`, `name`, `preview_text`, `detail_text`, `id_cat`, `picture`, `count_number`, `confirm`, `id`, `updated_at`, `created_at`, `keyword`) VALUES
  (2, 'file_put_contents() trong php', 'hàm file_put_contents() sẽ ghi nội dung vào file truyền vào. Nếu file không tồn tại, hàm sẽ tạo file và ghi nội dung vào đó.', '<p>H&agrave;m&nbsp;<code>file_put_contents()</code>&nbsp;sẽ ghi nội dung v&agrave;o file truyền v&agrave;o. Nếu file kh&ocirc;ng tồn tại, h&agrave;m sẽ tạo file v&agrave; ghi nội dung v&agrave;o đ&oacute;.</p>\r\n\r\n<p>VD: Khi th&ecirc;m 1 video youtube v&agrave;o web, ta lấy được link img của video v&agrave; d&ugrave;ng h&agrave;m file_put_contents() để lưu ảnh n&agrave;y v&agrave;o files trong storage.</p>\r\n\r\n<pre>\r\n   $arrContextOptions=array(\r\n                &quot;ssl&quot;=&gt;array(\r\n                    &quot;verify_peer&quot;=&gt;false,\r\n                    &quot;verify_peer_name&quot;=&gt;false,\r\n                ),\r\n            );\r\n    $link = $request-&gt;preview_picture;\r\n    $fileName = getenv(&#39;BASE_FILE_NAME&#39;).&#39;-&#39;.time().&#39;.png&#39;;\r\n    file_put_contents(storage_path(&#39;app/media/files/video/&#39;.$fileName), file_get_contents($link, false, stream_context_create($arrContextOptions)));\r\n    $request-&gt;preview_picture = $fileName;\r\n</pre>', 7, '1hKyuoP1s7jJl1XIIICWcb6f991X1XmcRzzkL3GQ.png', 0, 1, 1, '2018-09-05 08:10:20', '2018-07-08 16:14:14', NULL),
  (3, 'Tạo Cookie kiểm tra tăng view', 'Tạo Cookie kiểm tra tăng view', '<p>Tạo Cookie kiểm tra tăng view (chỉ tăng nếu reload sau 2h)</p>\r\n\r\n<pre>\r\n  if (Cookie::get(&#39;checkViewWithIpAndPhpUname&#39;)) {\r\n            // ton tai cookie\r\n            $nameCheckViewWithIpAndPhpUname = Cookie::get(&#39;checkViewWithIpAndPhpUname&#39;);\r\n            $arCheckViewWithIpAndPhpUname = explode(&#39;,&#39;,$nameCheckViewWithIpAndPhpUname);\r\n            if (!in_array($videoId, $arCheckViewWithIpAndPhpUname)) {\r\n                // neu k ton tai id trong cookie thi tang view va them id video khi tao cookie moi \r\n                $this-&gt;objmVideo-&gt;addView($id);\r\n                // tang view user\r\n                if (Auth::check()) {\r\n                    $this-&gt;objmVideoActivity-&gt;addView($id);\r\n                }\r\n                $ipAndpPhp_uname = $nameCheckViewWithIpAndPhpUname.&#39;,&#39;.$videoId.&#39;,&#39;.$strNow;\r\n                Cookie::queue(&quot;checkViewWithIpAndPhpUname&quot;, $ipAndpPhp_uname, 525600);\r\n            } else {\r\n                // neu ton tai id lay thoi gian khi them id video trong cookie va kiem tra thoi gian xem co sau 2 h\r\n                $key = array_search($videoId, $arCheckViewWithIpAndPhpUname);\r\n                $time = $arCheckViewWithIpAndPhpUname[$key+1];\r\n                if ($strNow - $time &gt; 7200) {\r\n                    // them view view va them id video voi thoi gian moi khi tao cookie moi \r\n                    $this-&gt;objmVideo-&gt;addView($id);\r\n                    // tang view user\r\n                    if (Auth::check()) {\r\n                        $this-&gt;objmVideoActivity-&gt;addView($id);\r\n                    }\r\n                    // unset id video cu\r\n                    unset ($arCheckViewWithIpAndPhpUname[$key]);\r\n                    unset ($arCheckViewWithIpAndPhpUname[$key+1]);\r\n                    //\r\n                    $nameCheckViewWithIpAndPhpUname = implode(&#39;,&#39;, $arCheckViewWithIpAndPhpUname);\r\n                    $ipAndpPhp_uname = $request-&gt;ip().&#39;-&#39;.php_uname(&#39;n&#39;).$nameCheckViewWithIpAndPhpUname.&#39;,&#39;.$videoId.&#39;,&#39;.$strNow;\r\n                    Cookie::queue(&quot;checkViewWithIpAndPhpUname&quot;, $ipAndpPhp_uname, 525600);\r\n                }\r\n            }\r\n        } else {\r\n            // k ton tai cookie tao cookie them view\r\n            $ipAndpPhp_uname = $request-&gt;ip().&#39;-&#39;.php_uname(&#39;n&#39;).&#39;,&#39;.$videoId.&#39;,&#39;.$strNow;\r\n            Cookie::queue(&quot;checkViewWithIpAndPhpUname&quot;, $ipAndpPhp_uname, 525600);\r\n            $this-&gt;objmVideo-&gt;addView($id);\r\n            // tang view user\r\n            if (Auth::check()) {\r\n                $this-&gt;objmVideoActivity-&gt;addView($id);\r\n            }\r\n        }\r\n</pre>', 7, 'pxF5UkTGkb4Vr8Xh33NTECCBz5dY1aAW1wkpSgNO.png', 0, 1, 1, '2018-09-05 08:10:08', '2018-07-08 16:22:01', NULL),
  (4, 'Làm việc với cơ sở dữ liệu trong Laravel', 'Laravel hiện đang hỗ trợ 4 loại CSDL phổ biến hiện nay: MySQL (Oracle) đã chuyển lên MariaDB, Postgres, SQLite, SQL Server (Microsoft). ', '<p>&nbsp;</p>\r\n\r\n<p>Truy vấn đến CSDL trong Laravel c&oacute; 3 phương thức l&agrave; truy vấn SQL thuần t&uacute;y, sử dụng Query Builder v&agrave; sử dụng Laravel Model (Eloquent ORM).</p>\r\n\r\n<h2>&nbsp; 1. Quản l&yacute; transaction trong CSDL</h2>\r\n\r\n<p>Giao dịch (transaction) l&agrave; một nh&oacute;m c&aacute;c h&agrave;nh động c&oacute; thứ tự tr&ecirc;n CSDL nhưng lại được người d&ugrave;ng xem như l&agrave; một đơn vị thao t&aacute;c duy nhất.&nbsp;Khi đ&oacute;, bất kỳ một h&agrave;nh động n&agrave;o bị lỗi sẽ dẫn đến giao dịch lỗi. Trong thực tế khi lập tr&igrave;nh, người ta thường nh&oacute;m c&aacute;c nhiều c&aacute;c h&agrave;nh động tr&ecirc;n CSDL v&agrave;o th&agrave;nh một nh&oacute;m v&agrave; thực hiện ch&uacute;ng như một giao dịch, nếu một h&agrave;nh động lỗi, hệ thống sẽ thực hiện c&aacute;c lệnh sao cho quay về trạng th&aacute;i ban đầu (rollback). Laravel cũng hỗ trợ quản l&yacute; transaction, thực hiện ch&uacute;ng kh&aacute; đơn giản với c&uacute; ph&aacute;p:</p>\r\n\r\n<pre>\r\nDB::transaction(function () {\r\n    DB::table(&#39;users&#39;)-&gt;update([&#39;votes&#39; =&gt; 1]);\r\n\r\n    DB::table(&#39;posts&#39;)-&gt;delete();\r\n}, 5);</pre>\r\n\r\n<p>Ch&uacute; &yacute; tham số thứ 2 của phương thức transaction() l&agrave; số lần thử thực hiện lại khi gặp t&igrave;nh trạng deadlock.</p>\r\n\r\n<p>Ngo&agrave;i ra bạn c&oacute; thể thao t&aacute;c quản l&yacute; transaction một c&aacute;ch thủ c&ocirc;ng như&nbsp;khi n&agrave;o mới rollback hoặc khi n&agrave;o mới commit một c&aacute;ch t&ugrave;y &yacute;:</p>\r\n\r\n<pre>\r\nDB::beginTransaction();\r\n// Bắt đầu c&aacute;c h&agrave;nh động tr&ecirc;n CSDL\r\n\r\n...\r\n//Gặp lỗi n&agrave;o đ&oacute; mới rollback\r\nDB::rollBack();\r\n...\r\n\r\n//Commit dữ liệu khi ho&agrave;n th&agrave;nh kiểm tra\r\nDB::commit();</pre>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>&nbsp;</p>', 8, 'DehDBOy7jCh3GUpy6D9IWTXY38jw3dKAhdaG5Cy7.png', 1, 1, 1, '2018-10-08 15:40:27', '2018-07-30 12:37:11', NULL),
  (5, 'Xây dựng truy vấn bằng Laravel Query Builder', 'Laravel Query Builder sử dụng PDO (PHP Data Object, hệ thống API có sẵn của PHP để kết nối đến các CSDL thông dụng)', '<h2>1.Truy xuất dữ liệu từ database</h2>\r\n\r\n<pre>\r\n//lấy tất cả\r\n$users = DB::table(&#39;users&#39;)-&gt;get();</pre>\r\n\r\n<pre>\r\n//lấy 1\r\n$user = DB::table(&#39;users&#39;)-&gt;where(&#39;name&#39;, &#39;test&#39;)-&gt;first();</pre>\r\n\r\n<pre>\r\n// lấy 1 cột\r\n$email = DB::table(&#39;users&#39;)-&gt;where(&#39;name&#39;, &#39;test&#39;)-&gt;value(&#39;email&#39;);</pre>\r\n\r\n<pre>\r\n// lấy nhiều cột\r\n$users = DB::table(&#39;users&#39;)-&gt;pluck(&#39;id&#39;, &#39;name&#39;);</pre>\r\n\r\n<ul>\r\n	<li>min: gi&aacute; trị nhỏ nhất</li>\r\n	<li>max: gi&aacute; trị lớn nhất</li>\r\n	<li>avg: gi&aacute; trị trung b&igrave;nh</li>\r\n	<li>count: tổng số bản ghi</li>\r\n	<li>sum: lấy tổng một trường n&agrave;o đ&oacute; của bảng</li>\r\n</ul>\r\n\r\n<h2>2.C&aacute;c phương thức trong&nbsp;query builder</h2>\r\n\r\n<h4>2.1 Select</h4>\r\n\r\n<pre>\r\n$users = DB::table(&#39;users&#39;)-&gt;select(&#39;name&#39;, &#39;email as user_email&#39;)-&gt;get();</pre>\r\n\r\n<pre>\r\n// distinct() để kh&ocirc;ng trả về kết quả tr&ugrave;ng lặp\r\n$users = DB::table(&#39;users&#39;)-&gt;distinct()-&gt;get();</pre>\r\n\r\n<h4>3.Raw expression</h4>\r\n\r\n<pre>\r\n$users = DB::table(&#39;users&#39;)\r\n        -&gt;select(DB::raw(&#39;count(*) as user_count, status&#39;))\r\n        -&gt;where(&#39;status&#39;, &#39;&lt;&gt;&#39;, 1)\r\n        -&gt;groupBy(&#39;status&#39;)\r\n        -&gt;get();</pre>\r\n\r\n<h4>4.Where</h4>\r\n\r\n<pre>\r\n// truyền mảng điều kiện trong where\r\n$users = DB::table(&#39;users&#39;)-&gt;where([\r\n    [&#39;active&#39;, &#39;=&#39;, &#39;1&#39;],\r\n    [&#39;vote&#39;, &#39;&gt;&#39;, &#39;50&#39;],\r\n    [&#39;name&#39;, &#39;like&#39;, &#39;%Ki&ecirc;n%&#39;],\r\n])-&gt;get();</pre>\r\n\r\n<pre>\r\n// V&iacute; dụ về orWhere\r\n$users = DB::table(&#39;users&#39;)\r\n                    -&gt;where(&#39;vote&#39;, &#39;&gt;&#39;, 50)\r\n                    -&gt;orWhere(&#39;comment&#39;, &#39;&gt;&#39;, 50)\r\n                    -&gt;get();\r\n// V&iacute; dụ về whereBetween\r\n$users = DB::table(&#39;users&#39;)\r\n                    -&gt;whereBetween(&#39;age&#39;, [18, 35])-&gt;get();\r\n// V&iacute; dụ về whereIn\r\n$users = DB::table(&#39;users&#39;)\r\n                    -&gt;whereIn(&#39;id&#39;, [1, 2, 3])\r\n                    -&gt;get();\r\n// V&iacute; dụ về whereNull\r\n$users = DB::table(&#39;users&#39;)\r\n                    -&gt;whereNull(&#39;vote&#39;)\r\n                    -&gt;get();\r\n// V&iacute; dụ về whereDate\r\n$users = DB::table(&#39;users&#39;)\r\n                -&gt;whereDate(&#39;join_date&#39;, &#39;2017-03-27&#39;)\r\n                -&gt;get();\r\n//V&iacute; dụ về whereDay\r\n$users = DB::table(&#39;users&#39;)\r\n                -&gt;whereDay(&#39;join_date&#39;, &#39;27&#39;)\r\n                -&gt;get();\r\n// V&iacute; dụ về whereMonth\r\n$users = DB::table(&#39;users&#39;)\r\n                -&gt;whereMonth(&#39;join_date&#39;, &#39;03&#39;)\r\n                -&gt;get();\r\n//V&iacute; dụ về whereYear\r\n$users = DB::table(&#39;users&#39;)\r\n                -&gt;whereYear(&#39;join_date&#39;, &#39;2017&#39;)\r\n                -&gt;get();\r\n//V&iacute; dụ về whereColumn\r\n$users = DB::table(&#39;account&#39;)\r\n                -&gt;whereColumn([\r\n                    [&#39;working_balance&#39;, &#39;=&#39;, &#39;last_balance&#39;],\r\n                    [&#39;updated_at&#39;, &#39;&gt;&#39;, &#39;created_at&#39;]\r\n                ])-&gt;get();\r\n// V&iacute; dụ về whereExist\r\nDB::table(&#39;users&#39;)\r\n            -&gt;whereExists(function ($query) {\r\n                $query-&gt;select(DB::raw(1))\r\n                      -&gt;from(&#39;orders&#39;)\r\n                      -&gt;whereRaw(&#39;orders.user_id = users.id&#39;);\r\n            })\r\n            -&gt;get();\r\n// V&iacute; dụ nh&oacute;m c&aacute;c điều kiện trong mệnh đề điều kiện\r\nDB::table(&#39;users&#39;)\r\n            -&gt;where(&#39;name&#39;, &#39;=&#39;, &#39;FirebirD&#39;)\r\n            -&gt;orWhere(function ($query) use ($nameRole) {\r\n                $query-&gt;where(&#39;vote&#39;, &#39;&gt;&#39;, 50)\r\n                      -&gt;where(&#39;role&#39;, &#39;&lt;&gt;&#39;, $nameRole);\r\n            })\r\n            -&gt;get();</pre>\r\n\r\n<h4>4.Thao t&aacute;c với kết quả trả về</h4>\r\n\r\n<pre>\r\n// lấy ngẫu nhi&ecirc;n\r\n$randomUser = DB::table(&#39;users&#39;)\r\n                -&gt;inRandomOrder()\r\n                -&gt;first();</pre>\r\n\r\n<pre>\r\n// \r\n$users = DB::table(&#39;users&#39;)\r\n                -&gt;groupBy(&#39;account_id&#39;)\r\n                -&gt;having(&#39;account_id&#39;, &#39;&gt;&#39;, 100)\r\n                -&gt;get();</pre>\r\n\r\n<h5>5.Insert một hoặc nhiều bản ghi v&agrave;o CSDL</h5>\r\n\r\n<pre>\r\n// Insert một bản ghi\r\nDB::table(&#39;users&#39;)-&gt;insert(\r\n    [&#39;name&#39; =&gt; &#39;Nguyễn Văn A&#39;, &#39;email&#39; =&gt; &#39;anv@gmail.com&#39;, &#39;votes&#39; =&gt; 0]\r\n);\r\n// Insert nhiều bản ghi\r\nDB::table(&#39;users&#39;)-&gt;insert([\r\n    [&#39;name&#39; =&gt; &#39;Nguyễn Văn A&#39;, &#39;email&#39; =&gt; &#39;anv@gmail.com&#39;, &#39;votes&#39; =&gt; 0],\r\n    [&#39;name&#39; =&gt; &#39;Nguyễn Văn B&#39;, &#39;email&#39; =&gt; &#39;bnv@gmail.com&#39;, &#39;votes&#39; =&gt; 0],\r\n    [&#39;name&#39; =&gt; &#39;Nguyễn Văn C&#39;, &#39;email&#39; =&gt; &#39;cnv@gmail.com&#39;, &#39;votes&#39; =&gt; 0],\r\n    [&#39;name&#39; =&gt; &#39;Nguyễn Văn D&#39;, &#39;email&#39; =&gt; &#39;dnv@gmail.com&#39;, &#39;votes&#39; =&gt; 0],\r\n]);</pre>\r\n\r\n<pre>\r\n// Insert get Id\r\n$user_id = DB::table(&#39;users&#39;)-&gt;insertGetId(\r\n    [&#39;name&#39; =&gt; &#39;Nguyễn Văn A&#39;, &#39;email&#39; =&gt; &#39;anv@gmail.com&#39;, &#39;votes&#39; =&gt; 0]\r\n);</pre>\r\n\r\n<h5>6.Update dữ liệu trong CSDL</h5>\r\n\r\n<pre>\r\nDB::table(&#39;users&#39;)\r\n    -&gt;whereYear(&#39;join_date&#39;, &#39;2017&#39;)\r\n    -&gt;orWhere(&#39;vote&#39;, &#39;&gt;&#39;, 50)\r\n    -&gt;update([&#39;generate_promote_code&#39; =&gt; 1]);</pre>\r\n\r\n<h5>7.Delete dữ liệu trong CSDL</h5>\r\n\r\n<pre>\r\nDB::table(&#39;users&#39;)\r\n     -&gt;where(&#39;active&#39;, &#39;=&#39;, 0)\r\n     -&gt;whereYear(&#39;join_date&#39;, &#39;2015&#39;)\r\n     -&gt;delete();</pre>\r\n\r\n<pre>\r\n// x&oacute;a all\r\nDB::table(&#39;users&#39;)-&gt;truncate();</pre>', 8, 'dDbRlV3wG71872MqsIUfVFqwXqVGXUlyBVlb12SM.png', 1, 1, 1, '2018-10-08 15:40:55', '2018-07-30 13:51:06', NULL),
  (6, 'Phân trang kết quả với Laravel Pagination', 'Laravel Pagination giúp cho việc phân trang ngay khi xây dựng các truy vấn một cách rất dễ dàng, ngoài ra tính năng phân trang này còn tự sinh mã HTML phù hợp với cách thiết kế trang web sử dụng Bootstrap.', '<h2>1. Ph&acirc;n trang kết quả truy vấn trong Laravel</h2>\r\n\r\n<pre>\r\npublic function index()\r\n    {\r\n        $products = DB::table(&#39;products&#39;)-&gt;paginate(5);\r\n        return view(&#39;fontend.product.list&#39;)-&gt;with($products);\r\n    }</pre>\r\n\r\n<p>phương thức paginate() c&oacute; thể sử dụng cho cả&nbsp;<a href=\"https://allaravel.com/laravel-tutorials/xay-dung-truy-van-bang-laravel-query-builder/\">Query Builder</a>&nbsp;v&agrave; Eloquent ORM, n&oacute; tự động t&iacute;nh to&aacute;n số lượng trang, c&aacute;c bản ghi n&agrave;o thuộc trang&hellip; Trang hiện tại sẽ được ph&aacute;t hiện trong qua tham số page trong query string của URL.</p>\r\n\r\n<p>Hiển thị kết quả ph&acirc;n trang trong view:</p>\r\n\r\n<pre>\r\n{{ $objItems-&gt;links() }}</pre>\r\n\r\n<p>C&aacute;c URL trong ph&acirc;n trang sẽ c&oacute; dạng http://laravel.dev/product?page=x, x l&agrave; trang hiện h&agrave;nh. Nếu bạn muốn th&ecirc;m c&aacute;c tham số query string v&agrave;o URL n&agrave;y, sử dụng phương thức appends(), v&iacute; dụ bạn muốn ph&acirc;n trang c&aacute;c sản phẩm c&oacute; gi&aacute; từ 300k đến 600k chẳng hạn, đường dẫn sẽ c&oacute; dạng http://laravel.dev/product?page=x&amp;minprice=300000&amp;maxprice=600000.</p>\r\n\r\n<pre>\r\n {{ $products-&gt;appends([&#39;minprice&#39; =&gt; 300000, &#39;maxprice&#39; =&gt; 600000])-&gt;links() }}</pre>\r\n\r\n<h2>2. Chỉnh sửa giao diện ph&acirc;n trang</h2>\r\n\r\n<p>Như đ&atilde; n&oacute;i ở phần đầu, mặc định giao diện phần ph&acirc;n trang trong Laravel Pagination tạo ra m&atilde; HTML tương th&iacute;ch với Bootstrap, ch&iacute;nh v&igrave; vậy nếu bạn kh&ocirc;ng sử dụng Bootstrap l&agrave;m CSS framework ch&iacute;nh của project bạn c&oacute; thể chỉnh sửa giao diện phần ph&acirc;n trang như sau:</p>\r\n\r\n<pre>\r\n{{ $products-&gt;links(&#39;pagination&#39;) }}</pre>\r\n\r\n<p>với pagination.blade.php l&agrave; một view nằm trong resources/views, ch&uacute;ng ta cũng ho&agrave;n to&agrave;n c&oacute; thể truyền tham số cho view n&agrave;y bằng c&aacute;ch:</p>\r\n\r\n<pre>\r\n  {{ $products-&gt;links(&#39;view.pagination&#39;, [&#39;minprice&#39; =&gt; 300000, &#39;maxprice&#39; =&gt; 600000]) }}</pre>\r\n\r\n<p>Một c&aacute;ch kh&aacute;c để chỉnh sửa giao diện phần ph&acirc;n trang l&agrave; chỉnh sửa ngay tr&ecirc;n ch&iacute;nh view mặc định của Laravel bằng c&aacute;ch export ch&uacute;ng v&agrave;o thư mục resouces/views/vendor sử dụng c&acirc;u lệnh</p>\r\n\r\n<pre>\r\nphp artisan vendor:publish --tag=laravel-pagination</pre>\r\n\r\n<p>C&acirc;u lệnh n&agrave;y sẽ export ra một view default.blade.php nằm trong&nbsp;resouces/views/vendor/pagination v&agrave; bạn chỉ đơn giản l&agrave; chỉnh sửa c&aacute;c m&atilde; HTML v&agrave; CSS trong view n&agrave;y.</p>\r\n\r\n<h2>3. C&aacute;c phương thức kh&aacute;c sử dụng trong Laravel Pagination</h2>\r\n\r\n<pre>\r\n$products = DB::table(&#39;products&#39;)-&gt;where(&#39;active&#39;, &#39;=&#39;, 1)-&gt;paginate(5);\r\n\r\n// Số trang trong kết quả $products trả về\r\n$products-&gt;count()\r\n\r\n// Trang hiện tại trong phần ph&acirc;n trang\r\n$results-&gt;currentPage()\r\n\r\n$results-&gt;firstItem()\r\n$results-&gt;hasMorePages()\r\n$results-&gt;lastItem()\r\n\r\n// Trang cuối c&ugrave;ng trong ph&acirc;n trang\r\n$results-&gt;lastPage()\r\n\r\n// Trang tiếp theo trong ph&acirc;n trang\r\n$results-&gt;nextPageUrl()\r\n$results-&gt;perPage()\r\n\r\n// Trang trước đ&oacute; trong ph&acirc;n trang\r\n$results-&gt;previousPageUrl()\r\n\r\n$results-&gt;total()\r\n$results-&gt;url($page)</pre>', 8, 'fqKQhQCh1bfSALJUjTwgIKMGtS6BzzghLwLJ0oFW.png', 1, 1, 1, '2018-11-06 12:50:13', '2018-07-30 15:30:19', NULL),
  (7, 'Laravel Migration và Laravel Seeding: quản lý phiên bản database', 'Laravel Migration và Laravel Seeding: quản lý phiên bản database', '<h2>1. Laravel Migration tạo c&aacute;c phi&ecirc;n bản database</h2>\r\n\r\n<h3>1.1 Tạo file migrate bằng c&acirc;u lệnh Artisan</h3>\r\n\r\n<p>Để tạo một Laravel Migration ch&uacute;ng ta sử dụng c&acirc;u lệnh artisan:</p>\r\n\r\n<pre>\r\nphp artisan make:migration categories</pre>\r\n\r\n<p>Khi đ&oacute; một file migration sẽ được tạo ra trong thư mục database/migrations, trong t&ecirc;n c&aacute;c file migration c&oacute; chứa th&ocirc;ng tin thời gian tạo ra gi&uacute;p cho Laravel sắp xếp v&agrave; x&aacute;c định được c&aacute;c file mirgration tại c&aacute;c thời điểm cần thiết.</p>\r\n\r\n<h3>1.2 Cấu tr&uacute;c c&aacute;c file migration</h3>\r\n\r\n<p>File migration chứa Migration class với hai phương thức up() v&agrave; down(), phương thức up() sử dụng để th&ecirc;m c&aacute;c bảng, cột hoặc tạo một index cho cột n&agrave;o đ&oacute; trong CSDL. Phương thức down() sử dụng để l&agrave;m những việc ngược lại với phương thức up().&nbsp;</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nuse Illuminate\\Support\\Facades\\Schema;\r\nuse Illuminate\\Database\\Schema\\Blueprint;\r\nuse Illuminate\\Database\\Migrations\\Migration;\r\n\r\nclass CreateProductsTable extends Migration\r\n{\r\n    /**\r\n     * Run the migrations.\r\n     *\r\n     * @return void\r\n     */\r\n    public function up()\r\n    {\r\n        Schema::create(&#39;categories&#39;, function (Blueprint $table) {\r\n            $table-&gt;increments(&#39;cat_id&#39;);\r\n            $table-&gt;string(&#39;cname&#39;);\r\n            $table-&gt;integer(&#39;sort&#39;);\r\n            $table-&gt;boolean(&#39;active&#39;);\r\n            $table-&gt;timestamps();\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Reverse the migrations.\r\n     *\r\n     * @return void\r\n     */\r\n    public function down()\r\n    {\r\n       Schema::dropIfExists(&#39;categories&#39;);\r\n    }\r\n}</pre>\r\n\r\n<h3>1.3 Thực hiện migration</h3>\r\n\r\n<p>Để chạy tất cả c&aacute;c migration c&oacute; trong database/migraions sử dụng lệnh artisan như sau:</p>\r\n\r\n<pre>\r\nphp artisan migrate</pre>\r\n\r\n<p>C&aacute;c migration file c&oacute; thể ảnh hưởng đến cấu tr&uacute;c database hiện tại, do đ&oacute; khi chạy lệnh tr&ecirc;n c&oacute; thể n&oacute; sẽ th&ocirc;ng b&aacute;o x&aacute;c nhận chạy hay kh&ocirc;ng, để &eacute;p buộc chạy migration m&agrave; kh&ocirc;ng hiển thị th&ocirc;ng b&aacute;o sử dụng th&ecirc;m t&ugrave;y chọn &ndash;force</p>\r\n\r\n<pre>\r\nphp artisan migrate --force</pre>\r\n\r\n<p>Trong qu&aacute; tr&igrave;nh migration c&oacute; thể bạn muốn quay trở lại cấu tr&uacute;c CSDL trước l&uacute;c thực thi c&aacute;c migration, ho&agrave;n to&agrave;n c&oacute; thể được bằng c&aacute;ch sử dụng rollback v&agrave; reset. Rollback th&igrave; cần cung cấp th&ecirc;m t&ugrave;y chọn &ndash;step l&agrave; rollback lại bao nhi&ecirc;u lần, c&ograve;n reset sẽ đưa cấu tr&uacute;c CSDL về thời điểm chưa c&oacute; bất kỳ một migration n&agrave;o.</p>\r\n\r\n<pre>\r\nphp artisan migrate:rollback --step=3\r\nphp artisan migrate:reset</pre>\r\n\r\n<p>Ngo&agrave;i ra, Laravel c&ograve;n cung cấp migrate:refresh, đ&uacute;ng như t&ecirc;n gọi của n&oacute;, lệnh ra rollback to&agrave;n bộ c&aacute;c migrate v&agrave; sau đ&oacute; chạy lại lệnh migrate, tức l&agrave; tương đương hai lệnh sau chạy lần lượt:</p>\r\n\r\n<pre>\r\nphp artisan migrate:reset\r\nphp artisan migrate</pre>\r\n\r\n<p>Nếu&nbsp;lỗi n&agrave;y sẽ xảy ra khi bạn sử dụng mySQL phi&ecirc;n bản 5.7.7 trở xuống. Để sửa lỗi n&agrave;y, bạn sửa lại file AppServiceProvider.php nằm trong thư mục app\\Providers</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nnamespace App\\Providers;\r\n\r\nuse Illuminate\\Support\\ServiceProvider;\r\nuse Schema;\r\n\r\nclass AppServiceProvider extends ServiceProvider\r\n{\r\n    /**\r\n     * Bootstrap any application services.\r\n     *\r\n     * @return void\r\n     */\r\n    public function boot()\r\n    {\r\n        Schema::defaultStringLength(191);\r\n    }\r\n\r\n    /**\r\n     * Register any application services.\r\n     *\r\n     * @return void\r\n     */\r\n    public function register()\r\n    {\r\n        //\r\n    }\r\n}</pre>\r\n\r\n<h2>2. Thao t&aacute;c với bảng, cột CSDL bằng Laravel Schema</h2>\r\n\r\n<h4>2.1 Thao t&aacute;c với bảng</h4>\r\n\r\n<p>Khi tạo bảng c&oacute; thể bảng đ&oacute; đ&atilde; tồn tại,&nbsp;ch&uacute;ng ta cần kiểm tra trước khi tạo, tương tự với c&aacute;c cột trong bảng th&ocirc;ng qua c&aacute;c phương thức hasTable() v&agrave; hasColumn():</p>\r\n\r\n<pre>\r\nif (!Schema::hasTable(&#39;products&#39;)) {\r\n        Schema::create(&#39;products&#39;, function (Blueprint $table) {\r\n            $table-&gt;increments(&#39;id&#39;);\r\n            $table-&gt;string(&#39;name&#39;);\r\n            $table-&gt;integer(&#39;price&#39;);\r\n            $table-&gt;mediumText(&#39;content&#39;);\r\n            $table-&gt;boolean(&#39;active&#39;);\r\n            $table-&gt;timestamps();\r\n        });\r\n}\r\n\r\nif (Schema::hasColumn(&#39;products&#39;, &#39;warranty_info&#39;)) {\r\n    //\r\n}</pre>\r\n\r\n<p>Ch&uacute;ng ta cũng c&oacute; thể thực hiện đổi t&ecirc;n bảng, x&oacute;a bảng</p>\r\n\r\n<pre>\r\n// Đổi t&ecirc;n bảng products th&agrave;nh san_pham\r\nSchema::rename(&#39;products&#39;, &#39;san_pham&#39;);\r\n// X&oacute;a bảng products\r\nSchema::drop(&#39;products&#39;);\r\n// X&oacute;a bảng products nếu n&oacute; tồn tại trong CSDL\r\nSchema::dropIfExists(&#39;products&#39;);</pre>\r\n\r\n<h4>2.2 Thao t&aacute;c với cột dữ liệu</h4>\r\n\r\n<p>Để tạo cột, sử dụng tham số thứ 2 trong phương thức create() l&agrave; đối tượng Blueprint để tạo bảng ở tr&ecirc;n.</p>\r\n\r\n<pre>\r\n  $table-&gt;increments(&#39;id&#39;);\r\n  $table-&gt;string(&#39;name&#39;);\r\n  $table-&gt;integer(&#39;price&#39;);\r\n  $table-&gt;mediumText(&#39;content&#39;);\r\n  $table-&gt;boolean(&#39;active&#39;);\r\n  $table-&gt;timestamps();</pre>\r\n\r\n<p>Danh s&aacute;ch c&aacute;c dạng cột c&oacute; thể tạo ra như sau:</p>\r\n\r\n<table>\r\n	<thead>\r\n		<tr>\r\n			<th>C&acirc;u lệnh</th>\r\n			<th>M&ocirc; tả</th>\r\n		</tr>\r\n	</thead>\r\n	<tbody>\r\n		<tr>\r\n			<td><code>$table-&gt;bigIncrements(&#39;id&#39;);</code></td>\r\n			<td>Incrementing ID (primary key) using a &ldquo;UNSIGNED BIG INTEGER&rdquo; equivalent.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;bigInteger(&#39;votes&#39;);</code></td>\r\n			<td>BIGINT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;binary(&#39;data&#39;);</code></td>\r\n			<td>BLOB equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;boolean(&#39;confirmed&#39;);</code></td>\r\n			<td>BOOLEAN equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;char(&#39;name&#39;,&nbsp;4);</code></td>\r\n			<td>CHAR equivalent with a length.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;date(&#39;created_at&#39;);</code></td>\r\n			<td>DATE equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;dateTime(&#39;created_at&#39;);</code></td>\r\n			<td>DATETIME equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;dateTimeTz(&#39;created_at&#39;);</code></td>\r\n			<td>DATETIME (with timezone) equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;decimal(&#39;amount&#39;,&nbsp;5,&nbsp;2);</code></td>\r\n			<td>DECIMAL equivalent with a precision and scale.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;double(&#39;column&#39;,&nbsp;15,&nbsp;8);</code></td>\r\n			<td>DOUBLE equivalent with precision, 15 digits in total and 8 after the decimal point.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;enum(&#39;choices&#39;,&nbsp;[&#39;foo&#39;,&nbsp;&#39;bar&#39;]);</code></td>\r\n			<td>ENUM equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;float(&#39;amount&#39;,&nbsp;8,&nbsp;2);</code></td>\r\n			<td>FLOAT equivalent for the database, 8 digits in total and 2 after the decimal point.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;increments(&#39;id&#39;);</code></td>\r\n			<td>Incrementing ID (primary key) using a &ldquo;UNSIGNED INTEGER&rdquo; equivalent.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;integer(&#39;votes&#39;);</code></td>\r\n			<td>INTEGER equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;ipAddress(&#39;visitor&#39;);</code></td>\r\n			<td>IP address equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;json(&#39;options&#39;);</code></td>\r\n			<td>JSON equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;jsonb(&#39;options&#39;);</code></td>\r\n			<td>JSONB equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;longText(&#39;description&#39;);</code></td>\r\n			<td>LONGTEXT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;macAddress(&#39;device&#39;);</code></td>\r\n			<td>MAC address equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;mediumIncrements(&#39;id&#39;);</code></td>\r\n			<td>Incrementing ID (primary key) using a &ldquo;UNSIGNED MEDIUM INTEGER&rdquo; equivalent.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;mediumInteger(&#39;numbers&#39;);</code></td>\r\n			<td>MEDIUMINT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;mediumText(&#39;description&#39;);</code></td>\r\n			<td>MEDIUMTEXT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;morphs(&#39;taggable&#39;);</code></td>\r\n			<td>Adds unsigned INTEGER&nbsp;<code>taggable_id</code>&nbsp;and STRING<code>taggable_type</code>.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;nullableMorphs(&#39;taggable&#39;);</code></td>\r\n			<td>Nullable versions of the&nbsp;<code>morphs()</code>&nbsp;columns.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;nullableTimestamps();</code></td>\r\n			<td>Nullable versions of the&nbsp;<code>timestamps()</code>&nbsp;columns.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;rememberToken();</code></td>\r\n			<td>Adds&nbsp;<code>remember_token</code>&nbsp;as VARCHAR(100) NULL.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;smallIncrements(&#39;id&#39;);</code></td>\r\n			<td>Incrementing ID (primary key) using a &ldquo;UNSIGNED SMALL INTEGER&rdquo; equivalent.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;smallInteger(&#39;votes&#39;);</code></td>\r\n			<td>SMALLINT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;softDeletes();</code></td>\r\n			<td>Adds nullable&nbsp;<code>deleted_at</code>&nbsp;column for soft deletes.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;string(&#39;email&#39;);</code></td>\r\n			<td>VARCHAR equivalent column.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;string(&#39;name&#39;,&nbsp;100);</code></td>\r\n			<td>VARCHAR equivalent with a length.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;text(&#39;description&#39;);</code></td>\r\n			<td>TEXT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;time(&#39;sunrise&#39;);</code></td>\r\n			<td>TIME equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;timeTz(&#39;sunrise&#39;);</code></td>\r\n			<td>TIME (with timezone) equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;tinyInteger(&#39;numbers&#39;);</code></td>\r\n			<td>TINYINT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;timestamp(&#39;added_on&#39;);</code></td>\r\n			<td>TIMESTAMP equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;timestampTz(&#39;added_on&#39;);</code></td>\r\n			<td>TIMESTAMP (with timezone) equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;timestamps();</code></td>\r\n			<td>Adds nullable&nbsp;<code>created_at</code>&nbsp;and&nbsp;<code>updated_at</code>&nbsp;columns.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;timestampsTz();</code></td>\r\n			<td>Adds nullable&nbsp;<code>created_at</code>&nbsp;and&nbsp;<code>updated_at</code>&nbsp;(with timezone) columns.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;unsignedBigInteger(&#39;votes&#39;);</code></td>\r\n			<td>Unsigned BIGINT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;unsignedInteger(&#39;votes&#39;);</code></td>\r\n			<td>Unsigned INT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;unsignedMediumInteger(&#39;votes&#39;);</code></td>\r\n			<td>Unsigned MEDIUMINT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;unsignedSmallInteger(&#39;votes&#39;);</code></td>\r\n			<td>Unsigned SMALLINT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;unsignedTinyInteger(&#39;votes&#39;);</code></td>\r\n			<td>Unsigned TINYINT equivalent for the database.</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>$table-&gt;uuid(&#39;id&#39;);</code></td>\r\n			<td>UUID equivalent for the database.</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p>Ngo&agrave;i ra c&aacute;c thiết lập kh&aacute;c c&oacute; thể đưa v&agrave;o khi tạo cột như: cột c&oacute; thể null, comment về cột, tạo cột sau một cột kh&aacute;c&hellip; Danh s&aacute;ch c&aacute;c thiết lập kh&aacute;c như sau:</p>\r\n\r\n<table>\r\n	<thead>\r\n		<tr>\r\n			<th>Modifier</th>\r\n			<th>Description</th>\r\n		</tr>\r\n	</thead>\r\n	<tbody>\r\n		<tr>\r\n			<td><code>-&gt;after(&#39;column&#39;)</code></td>\r\n			<td>Place the column &ldquo;after&rdquo; another column (MySQL Only)</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>-&gt;comment(&#39;my comment&#39;)</code></td>\r\n			<td>Add a comment to a column</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>-&gt;default($value)</code></td>\r\n			<td>Specify a &ldquo;default&rdquo; value for the column</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>-&gt;first()</code></td>\r\n			<td>Place the column &ldquo;first&rdquo; in the table (MySQL Only)</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>-&gt;nullable()</code></td>\r\n			<td>Allow NULL values to be inserted into the column</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>-&gt;storedAs($expression)</code></td>\r\n			<td>Create a stored generated column (MySQL Only)</td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>-&gt;unsigned()</code></td>\r\n			<td>Set&nbsp;<code>integer</code>&nbsp;columns to&nbsp;<code>UNSIGNED</code></td>\r\n		</tr>\r\n		<tr>\r\n			<td><code>-&gt;virtualAs($expression)</code></td>\r\n			<td>Create a virtual generated column (MySQL Only)</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p>Laravel cũng cho ph&eacute;p thay đổi c&aacute;c tham số trong dạng cột, t&ecirc;n cột&hellip; để thực hiện trước ti&ecirc;n phải c&agrave;i đặt một g&oacute;i&nbsp;doctrine/dbal, sử dụng lệnh&nbsp;<a href=\"https://allaravel.com/laravel-tutorials/composer-cong-cu-quan-ly-thu-vien-php-tuyet-voi/\">composer</a></p>\r\n\r\n<pre>\r\ncomposer require doctrine/dbal</pre>\r\n\r\n<p>Ok, sau khi c&agrave;i đặt g&oacute;i&nbsp;doctrine/dbal, ch&uacute;ng ta c&oacute; thể thay đổi thuộc t&iacute;nh của cột như sau:</p>\r\n\r\n<pre>\r\nSchema::table(&#39;products&#39;, function (Blueprint $table) {\r\n    $table-&gt;string(&#39;name&#39;, 50)-&gt;change();\r\n    $table-&gt;string(&#39;warranty&#39;)-&gt;nullable()-&gt;change();\r\n});</pre>\r\n\r\n<p>Hoặc thay đổi t&ecirc;n một cột trong bảng:</p>\r\n\r\n<pre>\r\nSchema::table(&#39;products&#39;, function (Blueprint $table) {\r\n    $table-&gt;renameColumn(&#39;warranty_info&#39;, &#39;thong_tin_bao_hanh&#39;);\r\n});</pre>\r\n\r\n<p>X&oacute;a tr&ecirc;n cột trong bảng</p>\r\n\r\n<pre>\r\nSchema::table(&#39;products&#39;, function (Blueprint $table) {\r\n    $table-&gt;dropColumn([&#39;price&#39;, &#39;content&#39;, &#39;warranty_info&#39;]);\r\n});</pre>\r\n\r\n<h4>2.4 C&aacute;c thiết lập kh&oacute;a ngoại</h4>\r\n\r\n<p>Laravel cũng cho ph&eacute;p thiết lập r&agrave;ng buộc kh&oacute;a ngoại, v&iacute; dụ: trong bảng products c&oacute; trường admin_id l&agrave; trường chứa ID của quản trị vi&ecirc;n đ&atilde; tạo sản phẩm, trường admin_id sẽ tham chiếu sang bảng admin chứa danh s&aacute;ch c&aacute;c quản trị vi&ecirc;n hệ thống.</p>\r\n\r\n<pre>\r\nSchema::table(&#39;products&#39;, function (Blueprint $table) {\r\n    $table-&gt;integer(&#39;admin_id&#39;)-&gt;unsigned();\r\n\r\n    $table-&gt;foreign(&#39;admin_id&#39;)-&gt;references(&#39;id&#39;)-&gt;on(&#39;admin&#39;);\r\n});</pre>\r\n\r\n<p>Khi đ&atilde; thiết lập kh&oacute;a ngoại, ch&uacute;ng ta c&oacute; thể thiết lập c&aacute;c h&agrave;nh động như update hay delete</p>\r\n\r\n<pre>\r\n$table-&gt;foreign(&#39;admin_id&#39;)\r\n      -&gt;references(&#39;id&#39;)-&gt;on(&#39;admin&#39;)\r\n      -&gt;onDelete(&#39;cascade&#39;);</pre>\r\n\r\n<p>Ch&uacute;ng ta cũng c&oacute; thể x&oacute;a kh&oacute;a ngoại bằng c&acirc;u lệnh</p>\r\n\r\n<pre>\r\n$table-&gt;dropForeign(&#39;products_admin_id_foreign&#39;);</pre>\r\n\r\n<p>Ch&uacute; &yacute;, t&ecirc;n kh&oacute;a ngoại giống như quy ước đặt t&ecirc;n trong index, t&ecirc;n bảng + t&ecirc;n cột + hậu tố _foreign. Laravel cho ph&eacute;p enable hoặc disable kh&oacute;a ngoại trong CSDL bằng lệnh</p>\r\n\r\n<pre>\r\nSchema::enableForeignKeyConstraints();\r\n\r\nSchema::disableForeignKeyConstraints();</pre>\r\n\r\n<h2>3. Đưa dữ liệu v&agrave;o database bằng Laravel Seeding</h2>\r\n\r\n<p>C&oacute; một số t&igrave;nh huống ch&uacute;ng ta cần đưa dữ liệu h&agrave;ng loạt v&agrave;o database như tạo dữ liệu test ứng dụng, đổ dữ liệu h&agrave;ng loạt phục vụ cho chuyển đổi hệ thống&hellip;&nbsp;Laravel cung cấp c&aacute;c phương thức đơn giản để thực hiện bằng c&aacute;ch tạo c&aacute;c c&aacute;c lớp mở rộng của lớp Seeder. C&aacute;c lớp Seeder được lưu trong thư mục database/seeds. Ch&uacute;ng ta c&oacute; thể tạo bằng tay một file c&oacute; phần mở rộng php hoặc tạo tự động một Seeder bằng c&aacute;ch sử dụng lệnh artisan như sau:</p>\r\n\r\n<pre>\r\nphp artisan make:seeder ProductsTableSeeder</pre>\r\n\r\n<p>Mỗi lớp Seeder sẽ c&oacute; một phương thức run(), phương thức n&agrave;y sẽ được thực thi khi thực hiện c&acirc;u lệnh</p>\r\n\r\n<pre>\r\nphp artisan db:seed</pre>\r\n\r\n<p>C&acirc;u lệnh artisan n&agrave;y sẽ thực thi tất cả c&aacute;c lớp Seeder c&oacute; trong thư mục database/seeds, nếu bạn kh&ocirc;ng muốn thực thi tất cả, bạn c&oacute; thể&nbsp;chỉ địch đ&iacute;ch danh một Seeder cần thực thi:</p>\r\n\r\n<pre>\r\nphp artisan db:seed --class=ProductsTableSeeder</pre>\r\n\r\n<p>Dữ liệu cần đổ v&agrave;o database sẽ được đưa v&agrave;o phương thức run() của Seeder mặc định l&agrave; DatabaseSeeder (đường dẫn đầy đủ l&agrave; database/seeds/DatabaseSeeder.php), v&iacute; dụ sau thực hiện đưa dữ liệu 4 sản phẩm v&agrave;o cơ sở dữ liệu.</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nuse Illuminate\\Database\\Seeder;\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass DatabaseSeeder extends Seeder\r\n{\r\n    /**\r\n     * Run the database seeds.\r\n     *\r\n     * @return void\r\n     */\r\n    public function run()\r\n    {\r\n        DB::table(&#39;products&#39;)-&gt;insert([\r\n           [&#39;name&#39; =&gt; str_random(255), &#39;price&#39; =&gt; &#39;300000&#39;, &#39;content&#39; =&gt; str_random(255), &#39;active&#39; =&gt; 1],\r\n           [&#39;name&#39; =&gt; str_random(255), &#39;price&#39; =&gt; &#39;400000&#39;, &#39;content&#39; =&gt; str_random(255), &#39;active&#39; =&gt; 1],\r\n           [&#39;name&#39; =&gt; str_random(255), &#39;price&#39; =&gt; &#39;500000&#39;, &#39;content&#39; =&gt; str_random(255), &#39;active&#39; =&gt; 1],\r\n           [&#39;name&#39; =&gt; str_random(255), &#39;price&#39; =&gt; &#39;600000&#39;, &#39;content&#39; =&gt; str_random(255), &#39;active&#39; =&gt; 1],\r\n        ]);\r\n    }\r\n}</pre>\r\n\r\n<p>Trong phương thức run() của Seeder mặc định&nbsp;DatabaseSeeder ch&uacute;ng ta cũng c&oacute; thể gọi đến c&aacute;c Seeder kh&aacute;c do ch&uacute;ng ta tạo ra:</p>\r\n\r\n<pre>\r\n/**\r\n * Run the database seeds.\r\n *\r\n * @return void\r\n */\r\npublic function run()\r\n{\r\n    $this-&gt;call(UsersTableSeeder::class);\r\n    $this-&gt;call(PostsTableSeeder::class);\r\n    $this-&gt;call(CommentsTableSeeder::class);\r\n}</pre>\r\n\r\n<h2>4. Tạo dữ liệu test cho ứng dụng</h2>\r\n\r\n<p>Laravel Seeding l&agrave; một trong những t&iacute;nh năng rất hay của Laravel gi&uacute;p đưa dữ liệu v&agrave;o Cơ sở dữ liệu, tuy nhi&ecirc;n khi tạo dữ liệu kiểm thử ứng dụng, ch&uacute;ng ta cần tạo ra nhiều bản ghi với c&aacute;c dữ liệu được tạo ra ngẫu nhi&ecirc;n v&agrave;&nbsp;<a href=\"https://github.com/fzaninotto/Faker\">Faker</a>&nbsp;l&agrave; một thư viện tuyệt vời cho mục đ&iacute;ch n&agrave;y. Faker l&agrave; một thư viện PHP được sử dụng để tạo ra dữ liệu giả cho mục đ&iacute;ch kiểm thử ứng dụng.</p>\r\n\r\n<h3>4.1 C&agrave;i đặt Faker trong Laravel</h3>\r\n\r\n<p>Laravel 5 trở l&ecirc;n c&agrave;i đặt Faker mặc định, do đ&oacute; bạn kh&ocirc;ng cần c&agrave;i đặt g&igrave; th&ecirc;m. Bạn c&oacute; thể kiểm tra c&aacute;c thư viện được c&agrave;i đặt trong file composer.json nằm trong thư mục gốc</p>\r\n\r\n<pre>\r\n &quot;require-dev&quot;: {\r\n        &quot;fzaninotto/faker&quot;: &quot;~1.4&quot;,\r\n        &quot;mockery/mockery&quot;: &quot;0.9.*&quot;,\r\n        &quot;phpunit/phpunit&quot;: &quot;~5.7&quot;\r\n    },</pre>\r\n\r\n<p>fzaninotto/faker ch&iacute;nh l&agrave; thư viện Faker cần c&agrave;i đặt. Nếu bạn đang sử dụng c&aacute;c phi&ecirc;n bản thấp hơn c&oacute; thể c&agrave;i đặt Faker bằng&nbsp;<a href=\"https://allaravel.com/laravel-tutorials/composer-cong-cu-quan-ly-thu-vien-php-tuyet-voi/\">composer</a>&nbsp;như sau:</p>\r\n\r\n<pre>\r\ncomposer require fzaninotto/faker --dev</pre>\r\n\r\n<p>Faker c&oacute; thể sử dụng để sinh ra c&aacute;c dữ liệu giả như số, văn bản text, th&ocirc;ng tin người d&ugrave;ng (t&ecirc;n, email, giới t&iacute;nh&hellip;), địa chỉ, số điện thoại, dữ liệu thời gian, m&agrave;u sắc, ảnh&hellip; Chi tiết c&aacute;c định dạng dữ liệu giả c&oacute; thể được sinh ra bởi Faker bạn c&oacute; thể&nbsp;<a href=\"https://github.com/fzaninotto/Faker#formatters\">xem tại đ&acirc;y</a>.</p>\r\n\r\n<h3>4.2. Sử dụng Faker tạo dữ liệu test</h3>\r\n\r\n<p>Đầu ti&ecirc;n, ch&uacute;ng ta<a href=\"https://allaravel.com/laravel-tutorials/cai-dat-laravel-nhanh-cho-he-dieu-hanh-windows/\">&nbsp;tạo một project Laravel</a>&nbsp;để thực h&agrave;nh với Faker.</p>\r\n\r\n<pre>\r\ncomposer create-project laravel/laravel faker</pre>\r\n\r\n<p>Hoặc nếu bạn đ&atilde; c&oacute; một dự &aacute;n Laravel sẵn ch&uacute;ng ta chuyển sang bước tiếp theo. Mở file routes/web.api (Ch&uacute; &yacute;: Laravel 5.3 trở l&ecirc;n chuyển file route.php trong app\\Http sang thư mục routes với web.api l&agrave; c&aacute;c route cho web) để thực h&agrave;nh với Faker:</p>\r\n\r\n<pre>\r\nRoute::get(&#39;/customers&#39;, function(){\r\n    $faker = Faker\\Factory::create();\r\n    $limit = 1000;\r\n    $customers = [];\r\n    for ($i = 0; $i &lt; $limit; $i++) {\r\n        $customers[$i] = [\r\n            &#39;Họ v&agrave; t&ecirc;n&#39;     =&gt; $faker-&gt;name,\r\n            &#39;Email&#39;         =&gt; $faker-&gt;unique()-&gt;email,\r\n            &#39;Số điện thoại&#39; =&gt; $faker-&gt;phoneNumber,\r\n            &#39;Website&#39;       =&gt; $faker-&gt;domainName,\r\n            &#39;Tuổi&#39;          =&gt; $faker-&gt;numberBetween(20,100),\r\n            &#39;Địa chỉ&#39;       =&gt; $faker-&gt;address\r\n        ];\r\n    }\r\n    return response()-&gt;json($customers);\r\n});</pre>\r\n\r\n<p>Thử truy nhập v&agrave;o đường dẫn /customers ch&uacute;ng ta sẽ thấy kết quả th&ocirc;ng tin giả của 1000 kh&aacute;ch h&agrave;ng được tạo ra như sau:</p>\r\n\r\n<p><img alt=\"Thông tin tạo ra bằng Faker\" src=\"https://allaravel.com/wp-content/uploads/2017/06/thong-tin-tao-ra-bang-faker.png\" style=\"height:474px; width:733px\" /></p>\r\n\r\n<p>Bạn thấy đấy, dữ liệu giả được tạo ra rất nhanh, trong ph&aacute;t triển ứng dụng, việc tạo ra c&aacute;c dữ liệu giả để test l&agrave; rất cần thiết, sẽ thật mất thời gian khi tự điền c&aacute;c dữ liệu giả v&agrave;o phải kh&ocirc;ng. Faker c&oacute; thể tạo ra rất nhiều c&aacute;c dạng dữ liệu giả kh&aacute;c nhau, dưới đ&acirc;y l&agrave; một số v&iacute; dụ về dữ liệu giả được tạo ra:</p>\r\n\r\n<pre>\r\n$faker-&gt;randomDigit;\r\n$faker-&gt;numberBetween(1,100);\r\n$faker-&gt;word;\r\n$faker-&gt;paragraph;\r\n$faker-&gt;lastName;\r\n$faker-&gt;city;\r\n$faker-&gt;year;\r\n$faker-&gt;domainName;\r\n$faker-&gt;creditCardNumber;</pre>\r\n\r\n<p>Ngo&agrave;i ra, Faker cho ph&eacute;p bạn tạo dữ liệu giả kh&ocirc;ng chỉ ng&ocirc;n ngữ tiếng Anh m&agrave; c&ograve;n với nhiều ng&ocirc;n ngữ kh&aacute;c:</p>\r\n\r\n<pre>\r\n$faker = Faker\\Factory::create(&#39;fr_FR&#39;);</pre>\r\n\r\n<p>Khi đ&oacute; dữ liệu giả sẽ c&oacute; dạng tiếng Ph&aacute;p,&nbsp;<a href=\"https://github.com/fzaninotto/Faker/tree/master/src/Faker/Provider\">Faker hỗ trợ rất nhiều c&aacute;c ng&ocirc;n ngữ</a>, rất tiếc l&agrave; kh&ocirc;ng c&oacute; tiếng Việt nhưng cũng kh&ocirc;ng vấn đề g&igrave; v&igrave; đ&acirc;y chỉ l&agrave; dữ liệu test th&ocirc;i.</p>', 8, '4aXN68k3uy0I2RflifnwG7lLyBjYL4FxaNrynApn.png', 0, 1, 1, '2018-09-05 08:05:19', '2018-07-30 16:17:28', NULL);
  INSERT INTO `news` (`id_news`, `name`, `preview_text`, `detail_text`, `id_cat`, `picture`, `count_number`, `confirm`, `id`, `updated_at`, `created_at`, `keyword`) VALUES
  (8, 'Thao tác với database qua Eloquent Model', 'Thao tác với database qua Eloquent Model', '<h3>1. Tạo Model.</h3>\r\n\r\n<pre>\r\nphp artisan make:model Product</pre>\r\n\r\n<h3>&nbsp;2.Tạo Model c&ugrave;ng với file migrate</h3>\r\n\r\n<p>Một vấn đề đặt ra l&agrave; khi bạn tạo Model nhưng bảng trong cơ sở dữ liệu chưa tồn tại th&igrave; sao? Ok, ch&uacute;ng ta sẽ phải thực hiện tạo một bảng mới th&ocirc;ng qua&nbsp;<a href=\"https://allaravel.com/laravel-tutorials/laravel-migration-va-laravel-seeding-quan-ly-phien-ban-database/\">Laravel Migration</a>, Laravel cũng hỗ trợ bạn một c&aacute;ch tự động lu&ocirc;n l&agrave; tạo Model k&egrave;m với file migrate lu&ocirc;n th&ocirc;ng qua việc th&ecirc;m tham số &ndash;migrate hoặc -m trong c&acirc;u lệnh tạo Model:</p>\r\n\r\n<pre>\r\nphp artisan make:model Product --migration\r\nphp artisan make:model Product -m</pre>\r\n\r\n<h3>3 Một số quy ước ngầm định của Eloquent Model</h3>\r\n\r\n<h4>3.1 Ngầm định t&ecirc;n bảng</h4>\r\n\r\n<p>Mỗi Model sẽ được mapping với một bảng dưới cơ sở dữ liệu, Laravel ngầm định một Model sẽ được map với một bảng c&oacute; t&ecirc;n ch&iacute;nh l&agrave; t&ecirc;n Model với dạng số nhiều trong tiếng Anh (th&ecirc;m s hoặc ies) c&ograve;n được gọi l&agrave; ti&ecirc;u chuẩn đặt t&ecirc;n Snake case. (Xem them&nbsp;<a href=\"https://allaravel.com/tutorials/quan-ly-thu-vien-lap-trinh/quy-chuan-dat-ten-trong-lap-trinh-camelcase-underscore-hay-pascalcase/\">C&aacute;c ti&ecirc;u chuẩn đặt t&ecirc;n trong lập tr&igrave;nh</a>).</p>\r\n\r\n<p>Snake case ở đ&acirc;y sẽ biến một t&ecirc;n lớp dạng PascalCase sang t&ecirc;n bảng dạng underscore (gạch ch&acirc;n) v&agrave; th&ecirc;m số nhiều v&agrave;o. V&iacute; dụ Model Product ở tr&ecirc;n sẽ tương ứng với bảng products. Nếu bạn muốn bỏ ngầm định n&agrave;y để map Model sang một bảng kh&aacute;c như my_products cũng rất đơn giản l&agrave; sử dụng thuộc t&iacute;nh $table để khai b&aacute;o.</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nnamespace App;\r\n\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass Product extends Model\r\n{\r\n    /**\r\n     * The table associated with the model.\r\n     *\r\n     * @var string\r\n     */\r\n    // Thay đổi c&aacute;c thiết lập ngầm định của Eloquent Model\r\n    protected $table = &#39;my_products&#39;;\r\n    public $primaryKey = &#39;product_code&#39;;\r\n    public $incrementing = false;\r\n}</pre>\r\n\r\n<h4>3.2 Ngầm định kh&oacute;a ch&iacute;nh</h4>\r\n\r\n<p>Eloquent Model ngầm định sử dụng trường c&oacute; t&ecirc;n id l&agrave; kh&oacute;a ch&iacute;nh (primary key), nếu bảng trong cơ sở dữ liệu sử dụng một trường kh&aacute;c l&agrave; kh&oacute;a ch&iacute;nh ch&uacute;ng ta c&oacute; thể khai b&aacute;o th&ocirc;ng qua thuộc t&iacute;nh $primaryKey, với trường kh&oacute;a ch&iacute;nh n&agrave;y nếu kh&ocirc;ng phải l&agrave; dạng dữ liệu số nguy&ecirc;n Integer v&agrave; tăng tự động, ch&uacute;ng ta cần thiết lập thuộc t&iacute;nh $incrementing th&agrave;nh false.</p>\r\n\r\n<h4>3.3 Log thời gian tương t&aacute;c bản ghi dữ liệu</h4>\r\n\r\n<p>Mặc định,&nbsp;Eloquent Model y&ecirc;u cầu c&aacute;c bảng trong CSDL phải c&oacute; c&aacute;c trường created_at v&agrave; updated_at lưu giữ th&ocirc;ng tin thời gian tạo bản ghi v&agrave; thời gian bản ghi n&agrave;y được cập nhật. T&iacute;nh năng n&agrave;y gi&uacute;p bạn quản l&yacute; c&aacute;c bản ghi trong CSDL rất tốt, đặc biệt trong c&aacute;c bảng li&ecirc;n quan đến giao dịch như đặt h&agrave;ng, thanh to&aacute;n&hellip; Tuy nhi&ecirc;n, nếu bạn kh&ocirc;ng muốn t&iacute;nh năng n&agrave;y, thiết lập thuộc t&iacute;nh&nbsp;$timestamps th&agrave;nh false.</p>\r\n\r\n<pre>\r\nnamespace App;\r\n\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass Product extends Model\r\n{\r\n    /**\r\n     * Indicates if the model should be timestamped.\r\n     *\r\n     * @var bool\r\n     */\r\n    public $timestamps = false;\r\n}</pre>\r\n\r\n<h4>4. Model Mass Assignment</h4>\r\n\r\n<p><strong>Mass Assignment l&agrave; g&igrave;?</strong>&nbsp;Mass Assignment xuất ph&aacute;t từ ng&ocirc;n ngữ Ruby on Rails, l&agrave; t&iacute;nh năng cho ph&eacute;p lập tr&igrave;nh một c&aacute;ch tự động g&aacute;n c&aacute;c tham số của một HTTP request v&agrave;o c&aacute;c biến hoặc đối tượng trong lập tr&igrave;nh. V&iacute; dụ: ch&uacute;ng ta c&oacute; một form đăng k&yacute; người d&ugrave;ng như sau, c&aacute;c t&ecirc;n trường nhập liệu tr&ugrave;ng với t&ecirc;n cột trong bảng users trong CSDL.</p>\r\n\r\n<pre>\r\n  &lt;form&gt;\r\n     &lt;input name=&#39;username&#39; type=&#39;text&#39;&gt;\r\n     &lt;input name=&#39;password&#39; type=&#39;text&#39;&gt;\r\n     &lt;input name=&#39;email&#39; type=&#39;text&#39;&gt;\r\n     &lt;input type=submit&gt;\r\n  &lt;/form&gt;</pre>\r\n\r\n<p>Khi&nbsp;đ&oacute; form n&agrave;y POST dữ liệu l&ecirc;n ch&uacute;ng ta c&oacute; thể ghi dữ liệu n&agrave;y v&agrave;o CSDL bằng đoạn code sau:</p>\r\n\r\n<pre>\r\n$user = new User(Input::all());</pre>\r\n\r\n<p>Thật ngắn gọn v&agrave; đơn giản đ&uacute;ng kh&ocirc;ng, t&iacute;nh năng n&agrave;y gọi l&agrave; Mass Assignment. Tuy nhi&ecirc;n, c&oacute; một lỗ hổng bảo mật xảy ra, nếu một kẻ xấu gửi th&ecirc;m dữ liệu user_type = &lsquo;admin&rsquo;, khi đ&oacute; user mới được tạo sẽ c&oacute; quyền admin, việc gắn th&ecirc;m dữ liệu gửi l&ecirc;n server l&agrave; rất đơn giản c&oacute; thể thực hiện bằng c&aacute;c c&ocirc;ng cụ c&oacute; sẵn tr&ecirc;n tr&igrave;nh duyệt như&nbsp;Chrome Developer Tools&hellip;</p>\r\n\r\n<p>Để xử l&yacute; vấn đề lỗ hổng trong Mass Assignment, Laravel đưa ra th&ecirc;m hai thuộc t&iacute;nh cho Model l&agrave; $fillable v&agrave; $guarded. V&iacute; dụ:</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nnamespace App;\r\n\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass User extends Model\r\n{\r\n    /**\r\n     * The attributes that are mass assignable.\r\n     *\r\n     * @var array\r\n     */\r\n    protected $fillable = [&#39;name&#39;, &#39;password&#39;, &#39;email&#39;];\r\n}</pre>\r\n\r\n<p>$fillable cho ph&eacute;p thiết lập c&aacute;c cột trong một bảng c&oacute; thể sử dụng t&iacute;nh năng Mass Assignment, khi đ&oacute; ta c&oacute; thể thực hiện:</p>\r\n\r\n<pre>\r\n$user = User::create(Input::all());\r\n// Hoặc\r\n$user = new User(Input::al());</pre>\r\n\r\n<p>Khi đ&oacute; nếu kẻ xấu gửi th&ecirc;m user_type l&agrave; trường kh&ocirc;ng c&oacute; trong $fillable, c&aacute;c c&acirc;u lệnh tr&ecirc;n sẽ ph&aacute;t sinh một exception ngay. Như vậy lỗ hổng trong Mass Assignment đ&atilde; được xử l&yacute;.</p>\r\n\r\n<p>Tr&aacute;i ngược với $fillable, ta c&oacute; thể định nghĩa c&aacute;c trường được bảo vệ khỏi Mass Assignment th&ocirc;ng qua thuộc t&iacute;nh $guarded.&nbsp;<strong>Ch&uacute; &yacute;, kh&ocirc;ng khai b&aacute;o cả hai thuộc t&iacute;nh n&agrave;y đồng thời.</strong></p>\r\n\r\n<p><strong>Ch&uacute; &yacute;:</strong>&nbsp;một vấn đề nữa l&agrave; $fillable v&agrave; $guarded chỉ c&oacute; t&aacute;c dụng với c&aacute;c phương thức của Eloquent Model, với c&aacute;c phương thức của Query Builder n&oacute; kh&ocirc;ng c&oacute; t&aacute;c dụng. V&iacute; dụ sau minh chứng cho điều n&agrave;y:</p>\r\n\r\n<pre>\r\n// Phương thức Eloquent \r\n$user = User::find($id);\r\n$user-&gt;update(Input::all());\r\n\r\n// Phương thức Query Builder\r\nUser::where(&#39;id&#39;, $id)-&gt;update(Input::all());</pre>\r\n\r\n<p>Khi đ&oacute; nếu kẻ xấu c&oacute; t&igrave;nh ch&egrave;n th&ecirc;m user_type = &lsquo;admin&rsquo; th&igrave; đoạn code đầu sẽ ph&aacute;t sinh exception c&ograve;n đoạn code sau vẫn chạy b&igrave;nh thường.</p>\r\n\r\n<h3>5. Một số phương thức tạo bản ghi kh&aacute;c</h3>\r\n\r\n<pre>\r\n// T&igrave;m user trong CSDL nếu kh&ocirc;ng c&oacute; th&igrave; insert bản ghi\r\n$user = User::firstOrCreate(Input::all());</pre>\r\n\r\n<pre>\r\n// update hoặc tạo mới một entry,\r\n$product = Product::updateOrCreate(\r\n    [&#39;name&#39; =&gt; &#39;abc&#39;, &#39;active&#39; =&gt; 1],\r\n    [&#39;price&#39; =&gt; 750000]\r\n);</pre>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>&nbsp;</p>', 8, 'yG5L90cOEYSXTFfDg62BzNJch2iuiPo0qOiLdYTD.png', 1, 1, 1, '2018-10-08 15:41:32', '2018-07-31 16:11:14', NULL),
  (9, 'Xử lý database relationship', 'Laravel Eloquent ORM xử lý các mối quan hệ dựa trên các Eloquent Model rất dễ dàng, nó hỗ trợ rất nhiều các mối quan hệ khác nhau trong database như một – một, một – nhiều, nhiều – nhiều, quan hệ đa ngôi, quan hệ đa hình…', '<h3>1.&nbsp;Quan hệ 1 &ndash; 1 one - one</h3>\r\n\r\n<p>1.1. Chiều&nbsp;Thuận:</p>\r\n\r\n<p>Quan hệ một &ndash; một (c&ograve;n gọi l&agrave; quan hệ 1-1 hay one to one) l&agrave; mối quan hệ cơ bản nhất, l&agrave; mối quan hệ giữa hai tập thực thể m&agrave; mỗi thực thể thuộc tập n&agrave;y chỉ c&oacute; duy nhất một mối quan hệ với một thực thể thuộc tập kia. V&iacute; dụ mỗi user chỉ c&oacute; 1 email v&agrave; mỗi email chỉ l&agrave; của 1 user.</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nnamespace App;\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass User extends Model\r\n{\r\n    public function email()\r\n    {\r\n        return $this-&gt;hasOne(&#39;App\\Email&#39;);\r\n    }\r\n}</pre>\r\n\r\n<p>&nbsp;Truy xuất v&agrave;o phương thức quan hệ.</p>\r\n\r\n<pre>\r\n// \r\n$phone = User::find(68)-&gt;phone;</pre>\r\n\r\n<pre>\r\n// tham số của hsaOne()\r\n//1. model , 2.kh&oacute;a ngoại, 3. trường kh&oacute;a ch&iacute;nh mặc định l&agrave; kh&oacute;a ch&iacute;nh\r\nreturn $this-&gt;hasOne(&#39;App\\Phone&#39;, &#39;foreign_key&#39;, &#39;local_key&#39;);</pre>\r\n\r\n<p>1.2. Chiều&nbsp;Ngich:</p>\r\n\r\n<pre>\r\n&lt;?php\r\nnamespace App;\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass Email extends Model\r\n{\r\n    public function user()\r\n    {\r\n        return $this-&gt;belongsTo(&#39;App\\User&#39;);\r\n    }\r\n}</pre>\r\n\r\n<h3>2. Quan hệ một &ndash; nhiều (one - many)</h3>\r\n\r\n<h4>2.1 Quan hệ một -nhiều</h4>\r\n\r\n<p>Quan hệ 1-n (c&ograve;n gọi l&agrave; quan hệ một &ndash; nhiều hay one to many) l&agrave; quan hệ&nbsp;giữa hai tập thực thể m&agrave; mỗi thực thể thuộc tập n&agrave;y c&oacute; quan hệ với nhiều thực thể thuộc tập kia. V&iacute; dụ, 1 danh mục truyện&nbsp;c&oacute; thể c&oacute; nhiều truyện</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nnamespace App;\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass Cat extends Model\r\n{\r\n    public function storys()\r\n    {\r\n        return $this-&gt;hasMany(&#39;App\\Story&#39;);\r\n    }\r\n}</pre>\r\n\r\n<pre>\r\n// lấy story từ 1 danh mục\r\n$storys= App\\Cat::find(68)-&gt;storys;\r\n\r\nforeach ($storys as $story) {\r\n    // Xử l&yacute; từng story của cat\r\n}</pre>\r\n\r\n<h4>2.2 Chiều ngược lại</h4>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nnamespace App;\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass Story extends Model\r\n{\r\n    public function cat()\r\n    {\r\n        return $this-&gt;belongsTo(&#39;App\\Cat&#39;);\r\n    }\r\n}</pre>\r\n\r\n<pre>\r\n// lấy dữ liệu cat của story\r\n$story = App\\Story::find(1);\r\n\r\necho $story-&gt;cat-&gt;name;</pre>\r\n\r\n<h3>3 Quan hệ nhiều &ndash; nhiều</h3>\r\n\r\n<h4>3.1 Định nghĩa quan hệ nhiều &ndash; nhiều</h4>\r\n\r\n<p>Quan hệ n-n (c&ograve;n gọi l&agrave; quan hệ nhiều &ndash; nhiều, hay quan hệ many to many) l&agrave; mối quan hệ giữa hai tập thực thể m&agrave; mỗi thực thể thuộc tập n&agrave;y c&oacute; thể c&oacute; quan hệ với nhiều thực thể của tập kia v&agrave;&nbsp;<strong>ngược lại</strong>. V&iacute; dụ, một Product c&oacute; thể nằm trong nhiều Order kh&aacute;c nhau v&agrave; một Order c&oacute; thể c&oacute; nhiều Product kh&aacute;c nhau, do đ&oacute; mối quan hệ Product-Order l&agrave; quan hệ n-n. Định nghĩa quan hệ n&agrave;y trong Eloquent sử dụng phương thức belongsToMany().</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nnamespace App;\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass Product extends Model\r\n{\r\n    public function order()\r\n    {\r\n        return $this-&gt;belongsToMany(&#39;App\\Order&#39;);\r\n    }\r\n}</pre>\r\n\r\n<p>&nbsp;</p>', 8, 'o1DiYfxQE4AGl9asjQvCcrCvewYm4wKjEhapowcj.png', 1, 1, 1, '2018-09-17 02:49:28', '2018-08-05 07:35:59', NULL),
  (10, 'Công cụ hỗ trợ cmd', 'Công cụ hỗ trợ cmd', '<p>1. Đi đến fodel: cd path</p>\r\n\r\n<p>2. L&ugrave;i 1 file: cd <code>../</code></p>\r\n\r\n<p>3. Tạo fodel: mkdir name</p>\r\n\r\n<p>4. Tạo file: cd . &gt; name.extention</p>', 7, '', 0, 0, 1, '2018-08-09 08:44:27', '2018-08-05 07:38:51', NULL),
  (11, 'Quan hệ many-to-many', 'Quan hệ many-to-many', '<p><strong>1. Ch&uacute;ng ta c&oacute; 3 table:&nbsp;</strong></p>\r\n\r\n<pre>\r\n<strong>user, group, group_user</strong>\r\n</pre>\r\n\r\n<p><em><strong>a. User</strong></em></p>\r\n\r\n<pre>\r\n class User extends Model { \r\n    public function groups() {\r\n        return $this-&gt;belongsToMany(&#39;App\\Model\\Group&#39;); \r\n    } \r\n}</pre>\r\n\r\n<p><em><strong>b. Table Group</strong></em></p>\r\n\r\n<pre>\r\n class Group extends Model {\r\n    public function users() {\r\n&nbsp;       return $this-&gt;belongsToMany(&#39;App\\User&#39;); \r\n    }\r\n }</pre>\r\n\r\n<p><em><strong>c. Relationship giữa user v&agrave; role</strong></em></p>\r\n\r\n<p>Quan hệ giữa group v&agrave; user l&agrave; many-to-many. Để thể hiện mối quan hệ n&agrave;y ch&uacute;ng ta sẽ tạo 1 table group_user</p>\r\n\r\n<h3><strong>2. Lấy dữ liệu bảng trung gian trong quan hệ nhiều &ndash; nhiều</strong></h3>\r\n\r\n<p>Để truy xuất c&aacute;c cột trong bảng trung gian ch&uacute;ng ta sử dụng thuộc t&iacute;nh pivot tr&ecirc;n đối tượng.</p>\r\n\r\n<pre>\r\n&lt;?php \r\nclass Group extends Model { &nbsp;&nbsp;\r\n&nbsp; &nbsp;protected $primaryKey = &quot;group_id&quot;; &nbsp; &nbsp;\r\n&nbsp;  public function user() &nbsp; &nbsp;\r\n&nbsp;  { &nbsp; &nbsp; \r\n&nbsp; &nbsp; return $this-&gt;belongsToMany(&#39;App\\User&#39;,&#39;group_user&#39;,&#39;group_id&#39;,&#39;user_id&#39;); &nbsp; \r\n   } \r\n}\r\n// group_user : bảng trung gian, \r\n// group_id : id của group trong bảng group_id, tt &nbsp; &nbsp;\r\n// Lấy tất cả user thuộc group c&oacute; id = 1 \r\n   $mGroup = new Group();\r\n// d&ugrave;ng pivot\r\n// lấy dữ liệu trong bảng user v&agrave; grouup_user \r\n$groups = $mGroup-&gt;find(1)-&gt;user;\r\n foreach ($groups as $key =&gt; $group) { &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; \r\n    &nbsp;echo &#39;&lt;hr&gt;User_id:&#39;.$group-&gt;id; &nbsp; &nbsp; \r\n&nbsp;&nbsp; &nbsp;&nbsp;echo &#39;&lt;br&gt;User_name:&#39;.$group-&gt;name; &nbsp; \r\n&nbsp; &nbsp;&nbsp; echo &#39;&lt;br&gt;Email:&#39;.$group-&gt;email; &nbsp; &nbsp; &nbsp;&nbsp; \r\n&nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;br&gt;Group_id:&#39;.$group-&gt;pivot-&gt;group_id; &nbsp;\r\n &nbsp;}\r\n</pre>\r\n\r\n<pre>\r\n// D&ugrave;ng with() // lấy dc dữ liệu cả 3 bảng\r\n</pre>\r\n\r\n<pre>\r\n$groups2 = $mGroup-&gt;with(&#39;user&#39;)-&gt;find(1);\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;hr&gt;Group ID: &#39;.$groups2-&gt;group_id;\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;br&gt;Group Name: &#39;.$groups2-&gt;gname;\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;foreach ($groups2-&gt;user as $key =&gt; $v) {\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;br&gt;User name: &#39;.$v-&gt;name;\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;br&gt;Email: &#39;.$v-&gt;mail;\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n</pre>\r\n\r\n<pre>\r\n// Lấy tất cả group v&agrave; user thuộc group đ&oacute;\r\n</pre>\r\n\r\n<pre>\r\n$groups3 = $mGroup-&gt;with(&#39;user&#39;)-&gt;get();\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;foreach ($groups3 as $key =&gt; $group) {\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;hr&gt;Group ID: &#39;.$group-&gt;group_id;\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;br&gt;Group Name: &#39;.$group-&gt;gname;\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;foreach ($group-&gt;user as $key =&gt; $v) {\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;br&gt;User name: &#39;.$v-&gt;name;\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;echo &#39;&lt;br&gt;Email: &#39;.$v-&gt;mail;\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;}\r\n</pre>\r\n\r\n<p>Mặc định, chỉ c&aacute;c kh&oacute;a của Model c&oacute; trong đối tượng pivot, nếu bảng group_user của bạn chứa c&aacute;c thuộc t&iacute;nh kh&aacute;c nữa, bạn cần khai b&aacute;o ch&uacute;ng khi định nghĩa quan hệ.</p>\r\n\r\n<pre>\r\nreturn $this-&gt;belongsToMany(&#39;App\\Model\\Group&#39;)-&gt;withPivot(&#39;column1&#39;, &#39;column2&#39;); </pre>\r\n\r\n<p>Với c&aacute;c cột created_at, updated_at nếu muốn pivot tự động quản l&yacute; sử dụng phương thức withTimestamps():</p>\r\n\r\n<pre>\r\nreturn $this-&gt;belongsToMany(&#39;App\\Model\\Group&#39;)-&gt;withTimestamps();</pre>\r\n\r\n<h3><strong>3. Lọc kết quả quan hệ trong qua bảng trung gian</strong></h3>\r\n\r\n<p>Đ&ocirc;i khi ch&uacute;ng ta muốn trả về c&aacute;c bản ghi trong mối quan hệ hạn chế bởi việc lọc qua một số cột trong bảng trung gian c&oacute; thể sử dụng c&aacute;c phương thức wherePivot() hoặc wherePivotIn() khi định nghĩa quan hệ.</p>\r\n\r\n<pre>\r\nreturn $this-&gt;belongsToMany(&#39;App\\Product&#39;)-&gt;wherePivot(&#39;review&#39;, 1);\r\nreturn $this-&gt;belongsToMany(&#39;App\\Product&#39;)-&gt;wherePivotIn(&#39;priority&#39;, [1, 2]);\r\n</pre>\r\n\r\n<h3><strong>3. Th&ecirc;m, sửa, x&oacute;a dữ liệu trong many-to-many</strong></h3>\r\n\r\n<h3><strong>3.1 Th&ecirc;m.</strong></h3>\r\n\r\n<p>V&iacute; dụ ch&uacute;ng ta muốn add th&ecirc;m 1 group cho 1 user&nbsp;cụ thể, ch&uacute;ng ta sử dụng method&nbsp;<strong>attach()</strong>:</p>\r\n\r\n<p>// Th&ecirc;m group cho user</p>\r\n\r\n<pre>\r\npublic function addGroupForUser($id, $gid)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$mUser = new User();\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$user = $mUser-&gt;find($id);\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$user-&gt;groups()-&gt;attach($gid);\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;return &#39;Đ&atilde; th&ecirc;m Group &#39;.$gid.&#39; cho User &#39;.$id;\r\n&nbsp; &nbsp; }\r\n</pre>\r\n\r\n<p>// Nếu muốn th&ecirc;m nhiều group cho 1 user</p>\r\n\r\n<pre>\r\n$user-&gt;groups()-&gt;attach([$gid1, $gid2, $gid3]);</pre>\r\n\r\n<p>// Nếu trong bảng group_user c&oacute; th&ecirc;m c&aacute;c column kh&aacute;c.</p>\r\n\r\n<pre>\r\n$user-&gt;groups()-&gt;attach($id,[&#39;lang&#39; =&gt; &#39;vn&#39;]);\r\n</pre>\r\n\r\n<h3><strong>3.2 X&oacute;a</strong></h3>\r\n\r\n<p>Cũng tương tự vậy, nếu như ch&uacute;ng ta muốn gỡ bỏ 1 tag từ article th&igrave; ch&uacute;ng ta sử dụng method&nbsp;<strong>detach()</strong>:</p>\r\n\r\n<pre>\r\npublic function delGroupForUser($id, $gid) &nbsp;\r\n{ &nbsp; &nbsp; &nbsp;&nbsp; \r\n&nbsp; $mUser = new User(); &nbsp;\r\n &nbsp;$user = $mUser-&gt;find($id); &nbsp; \r\n&nbsp; $user-&gt;groups()-&gt;detach($gid); &nbsp; &nbsp; &nbsp;&nbsp;\r\n &nbsp;return &#39;Đ&atilde; x&oacute;a Group &#39;.$gid.&#39; cho User &#39;.$id; &nbsp;\r\n}</pre>\r\n\r\n<p>// Nếu muốn x&oacute;a&nbsp;nhiều group cho 1 user</p>\r\n\r\n<pre>\r\n$user = $mUser-&gt;find(1);\r\n$user-&gt;groups()-&gt;detach([$gid1, $gid2, $gid3]);\r\n//x&oacute;a to&agrave;n bộ group cho 1 user\r\n$user-&gt;groups()-&gt;detach();</pre>\r\n\r\n<h3><strong>3.3 Sửa</strong></h3>\r\n\r\n<p>// Nếu muốn update lại group của 1 user (những group k dc chọn sẽ bị x&oacute;a)</p>\r\n\r\n<pre>\r\npublic function updateGroupForUser($id)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$mUser = new User();\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$user = $mUser-&gt;find($id);\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$user-&gt;groups()-&gt;sync([$gid1, $gid2]);\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;return &#39;Đ&atilde; cập nhật Group cho User &#39;.$id;\r\n&nbsp; &nbsp; }</pre>\r\n\r\n<p>// Nếu bản group_user c&oacute; th&ecirc;m column kh&aacute;c v&agrave; muốn update những column n&agrave;y</p>\r\n\r\n<pre>\r\npublic function updateGroupForUser($id)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$mUser = new User();\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$user = $mUser-&gt;find($id);\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$user-&gt;groups()-&gt;sync([1 =&gt; [&#39;lang&#39; =&gt; &#39;AA&#39;],2 =&gt; [&#39;lang&#39; =&gt; &#39;BB&#39;]]);\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;return &#39;Đ&atilde; cập nhật Group cho User &#39;.$id;\r\n&nbsp; &nbsp; }\r\n</pre>\r\n\r\n<p>&nbsp;</p>', 8, 'mU8xJ6n0WgZL8BHFV7beTB0TOiV3yB6dMXZWWfox.png', 1, 1, 1, '2018-09-17 02:48:59', '2018-08-07 15:38:23', NULL),
  (12, 'Quan hệ 3 ngôi', 'Quan hệ 3 ngôi', '<h2><strong>1. Quan hệ 3 ng&ocirc;i</strong></h2>\r\n\r\n<p>Quan hệ 3 ng&ocirc;i (Has many through) l&agrave; quan hệ giữa 3 tập thực thể m&agrave; mỗi thực thể tập A quan hệ với thực thể tập C th&ocirc;ng qua mối quan hệ của thực thể tập B. V&iacute; dụ sau gi&uacute;p bạn hiểu r&otilde; hơn về mối quan hệ 3 ng&ocirc;i, một danh mục&nbsp;h&agrave;ng&nbsp;c&oacute; nhiều sản phẩm&nbsp;, 1 sản phẩm c&oacute; nhiều h&igrave;nh ảnh . Như vậy Product sẽ l&agrave; trung gian của mối quan hệ giữa Category v&agrave; Picture.</p>\r\n\r\n<pre>\r\nCategory          Product              Picture\r\ncat_id            product_id           picture_id\r\ncname             pname                product_id\r\nactive            cat_id  </pre>\r\n\r\n<p>Khi đ&oacute; muốn lấy tất cả c&aacute;c picture của một Category cho trước, ch&uacute;ng ta cần định nghĩa mối quan hệ 3 ng&ocirc;i n&agrave;y.</p>\r\n\r\n<pre>\r\npublic function productThree()\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;hasManyThrough(&#39;App\\Model\\Picture&#39;, &#39;App\\Model\\Product&#39;, &#39;cat_id&#39;, &#39;product_id&#39;, &#39;cat_id&#39;);\r\n&nbsp; &nbsp; }\r\n// App\\Model\\Picture : model cần truy vấn\r\n// App\\Model\\Product : model trung gian \r\n// cat_id(3) : kho&aacute; ngoại (bảng ch&iacute;nh : category vs bảng trung gian : product) trong bảng trung gian\r\n// product_id :kh&oacute;a ngoại (bảng trung gian vs bảng cần truy vấn : picture) trong bảng cần truy vấn \r\n// cat_id : kh&oacute;a ch&iacute;nh bảng ch&iacute;nh</pre>', 8, 'uh1IY7D4eAIBZsMYFvbN2hjh2mX0FVjJs3n4OE1T.png', 1, 1, 1, '2018-09-17 01:37:46', '2018-08-09 09:19:35', NULL),
  (13, 'Quan hệ đa hình – Polymorphic Relations', 'Quan hệ đa hình cho phép một thực thể của một tập hợp phụ thuộc vào một hoặc nhiều thực thể của các tập hợp khác', '<h4><strong>1 Quan hệ đa h&igrave;nh</strong></h4>\r\n\r\n<p>V&iacute; dụ, một người d&ugrave;ng trong ứng dụng c&oacute; thể like cả sản phẩm&nbsp;v&agrave; b&igrave;nh luận. Nếu sử dụng quan hệ đa h&igrave;nh ch&uacute;ng ta c&oacute; thể sử dụng duy nhất bảng like cho t&igrave;nh huống n&agrave;y.</p>\r\n\r\n<pre>\r\nproducts           likes            comments\r\npk:product_id      pk:like_id       pk:coment_id\r\npname              object_id        content\r\ndetail             object_type\r\n// object_id : news_id hoặc comment_id\r\n// object_type : path Model 2 bảng c&ograve;n lại vd: App\\Model\\Product nếu object_id l&agrave; product_id hoặc App\\model\\Comment nếu l&agrave; comment_id\r\n<strong>Model:</strong>\r\n\r\nclass Like extends Model\r\n{\r\n    public function object()\r\n    {\r\n        return $this-&gt;morphTo();\r\n    }\r\n}\r\n\r\nclass Comment extends Model\r\n{\r\n    public function comments()\r\n    {\r\n        return $this-&gt;morphMany(&#39;App\\Model\\Like&#39;, &#39;object&#39;);\r\n    }\r\n}\r\n\r\nclass Product extends Model\r\n{\r\n    public function comments()\r\n    {\r\n        return $this-&gt;morphMany(&#39;App\\Model\\Like&#39;, &#39;object&#39;);\r\n    }\r\n}</pre>\r\n\r\n<p><strong>Truy vấn dữ liệu:&nbsp;</strong></p>\r\n\r\n<pre>\r\n        $mProduct = new Product();\r\n&nbsp; &nbsp; &nbsp; &nbsp; $mComment = new Comment();\r\n&nbsp; &nbsp; &nbsp; &nbsp; // Truy vấn like của 1 sản phẩm (product_id = 1)\r\n&nbsp; &nbsp; &nbsp; &nbsp; $products = $mProduct-&gt;find(1)-&gt;likes;\r\n&nbsp; &nbsp; &nbsp; &nbsp; foreach ($products as $key =&gt; $v) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &#39;ID like : &#39;.$v-&gt;like_id;\r\n&nbsp; &nbsp; &nbsp; &nbsp; }\r\n\r\n&nbsp; &nbsp; &nbsp; &nbsp; // Truy vấn like của 1 comment (comment_id = 1)\r\n&nbsp; &nbsp; &nbsp; &nbsp; $comments = $mComment-&gt;find(1)-&gt;likes;\r\n&nbsp; &nbsp; &nbsp; &nbsp; foreach ($comments as $key =&gt; $v) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &#39;ID like : &#39;.$v-&gt;like_id;\r\n&nbsp; &nbsp; &nbsp; &nbsp; }\r\n\r\n&nbsp; &nbsp; &nbsp; &nbsp; // Truy vấn like của tất cả sản phẩm\r\n&nbsp; &nbsp; &nbsp; &nbsp; $products = $mProduct-&gt;with(&#39;likes&#39;)-&gt;get();\r\n&nbsp; &nbsp; &nbsp; &nbsp; foreach ($products as $key =&gt; $v) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &#39;&lt;hr&gt;ID Product : &#39;.$v-&gt;product_id;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach ($v-&gt;likes as $key =&gt; $vc) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &#39;&lt;br&gt;ID like : &#39;.$vc-&gt;like_id;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }\r\n&nbsp; &nbsp; &nbsp; &nbsp; }\r\n\r\n&nbsp; &nbsp; &nbsp; &nbsp; // Truy vấn like của tất cả sản phẩm c&oacute; like\r\n&nbsp; &nbsp; &nbsp; &nbsp; $products = $mProduct-&gt;with(&#39;likes&#39;)-&gt;has(&#39;likes&#39;)-&gt;get();\r\n&nbsp; &nbsp; &nbsp; &nbsp; foreach ($products as $key =&gt; $v) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &#39;&lt;hr&gt;ID Product : &#39;.$v-&gt;product_id;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach ($v-&gt;likes as $key =&gt; $vc) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &#39;&lt;br&gt;ID like : &#39;.$vc-&gt;like_id;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }\r\n&nbsp; &nbsp; &nbsp; &nbsp; }\r\n</pre>\r\n\r\n<h4><strong>2.&nbsp; Quan hệ đa h&igrave;nh nhiều &ndash; nhiều.</strong></h4>\r\n\r\n<p>Cũng giống như v&iacute; dụ tr&ecirc;n nhưng ta th&ecirc;m bảng activitys để lưu chi tiết h&agrave;nh động like như user like, created_at&nbsp;</p>\r\n\r\n<pre>\r\nproducts           likes            comments            activitys\r\npk:product_id      activity_id      pk:coment_id        pk:activity_id     \r\npname              object_id        content             user_id\r\ndetail             object_type                          created_at\r\n// Comment quan hệ n-n với activity, Product quan hệ n-n với activity\r\n</pre>\r\n\r\n<p><strong>Model Comment, Product</strong></p>\r\n\r\n<pre>\r\nclass Comment extends Model\r\n{\r\n    public function activitys()\r\n    {\r\n        return $this-&gt;morphToMany(&#39;App\\Model\\Activity&#39;, &#39;likes&#39;);\r\n    }\r\n}\r\n\r\nclass Product extends Model\r\n{\r\n    public function activitys()\r\n    {\r\n        return $this-&gt;morphToMany(&#39;App\\Model\\Activity&#39;, &#39;likes&#39;);\r\n    }\r\n}</pre>\r\n\r\n<p><strong>Model Activity:</strong></p>\r\n\r\n<pre>\r\nclass Activity extends Model\r\n{\r\n    public function comments()\r\n    {\r\n        return $this-&gt;morphedByMany(&#39;App\\Model\\Comment&#39;, &#39;likes&#39;);\r\n    }\r\n\r\n    public function products()\r\n    {\r\n        return $this-&gt;morphedByMany(&#39;App\\Model\\Product&#39;, &#39;likes&#39;);\r\n    }\r\n}</pre>\r\n\r\n<p><strong>Truy vấn dữ liệu:</strong></p>', 8, 'R9hUyEJXc9f44DMYbNg02vBgewxSeK43oS0fi61k.png', 1, 1, 1, '2018-10-20 03:55:47', '2018-08-11 09:49:53', NULL),
  (14, 'Laravel 5x Shopping cart (P1)', 'Tìm hiểu laravel & Xây dựng website bán hàng cùng Laravel 5x.', '<h3><strong>1. Installation</strong></h3>\r\n\r\n<p>C&agrave;i đặt package th&ocirc;ng qua&nbsp;<a href=\"https://getcomposer.org/\" target=\"_blank\">Composer</a>.</p>\r\n\r\n<pre>\r\ncomposer require gloudemans/shoppingcart</pre>\r\n\r\n<p>Sau khi c&agrave;i đặt xong, bạn cần c&agrave;i add service provider của package v&agrave; alias của package.</p>\r\n\r\n<pre>\r\nGloudemans\\Shoppingcart\\ShoppingcartServiceProvider::class</pre>\r\n\r\n<pre>\r\n&#39;Cart&#39; =&gt; Gloudemans\\Shoppingcart\\Facades\\Cart::class</pre>\r\n\r\n<h3><strong>2. C&aacute;c phương thức của Cart:</strong></h3>\r\n\r\n<p><strong>Cart::add()</strong></p>\r\n\r\n<pre>\r\nCart::add([\r\n    &#39;id&#39;       =&gt; &#39;tshirt&#39;,\r\n    &#39;name&#39;     =&gt; &#39;T-Shirt&#39;,\r\n    &#39;quantity&#39; =&gt; 1,\r\n    &#39;price&#39;    =&gt; 12.50,\r\n]);\r\n// 4 tham số required hoặc c&oacute; thể đơn giản Cart::add([&#39;tshirt&#39;,&#39;T-shirt&#39;,1,12.50]);\r\n</pre>\r\n\r\n<pre>\r\nCart::add([\r\n    &#39;id&#39;         =&gt; &#39;tshirt&#39;,\r\n    &#39;name&#39;       =&gt; &#39;T-Shirt&#39;,\r\n    &#39;quantity&#39;   =&gt; 1,\r\n    &#39;price&#39;      =&gt; 12.50,\r\n    &#39;sku&#39;        =&gt; &#39;tshirt-red-large&#39;,\r\n    &#39;attributes&#39; =&gt; [\r\n\r\n        &#39;color&#39; =&gt; [\r\n            &#39;label&#39; =&gt; &#39;Red&#39;,\r\n            &#39;value&#39; =&gt; &#39;red&#39;,\r\n        ],\r\n\r\n        &#39;size&#39; =&gt; [\r\n            &#39;label&#39; =&gt; &#39;Large&#39;,\r\n            &#39;value&#39; =&gt; &#39;l&#39;,\r\n        ],\r\n\r\n    ],\r\n]);\r\n// bạn c&oacute; thể th&ecirc;m c&aacute;c thuộc t&iacute;nh option kh&aacute;c.\r\n// Nếu muốn th&ecirc;m nhiều sản phẩm : Cart::add([ array1,array2 ]);</pre>', 1, '5pkxmMuw3V49StYelCy2hM3ZGNfB2ZsIvmOCLqLl.jpeg', 0, 0, 1, '2018-08-13 15:03:10', '2018-08-13 15:03:10', NULL),
  (15, 'Tạo Cookie trong laravel', 'Tạo Cookie trong laravel', '<p><strong>Ở đ&acirc;y m&igrave;nh sẽ tạo 1 cookie để lưu lại lịch sử xem cả người d&ugrave;ng Laravel 5.6.</strong></p>\r\n\r\n<p>Bạn c&oacute; thể sử dụng thư viện Cookie hoặc Request để tạo cookie.</p>\r\n\r\n<p>Tạo cookie:</p>\r\n\r\n<pre>\r\npublic function setCookie($id)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; if (Cookie::has(&#39;_pro_his&#39;)) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_pro_his = $this-&gt;__decryptp(Cookie::get(&#39;_pro_his&#39;));\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_ar_pro_his = explode(&#39;,&#39;,$_pro_his);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array_unshift($_ar_pro_his,$product_id);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_ar_pro_his = array_unique($_ar_pro_his);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (count($_ar_pro_his) &gt;= 7) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array_pop($_ar_pro_his);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_pro_his = implode(&#39;,&#39;, $_ar_pro_his);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cookie::queue(Cookie::make(&#39;_pro_his&#39;, $_pro_his, 525600));\r\n&nbsp; &nbsp; &nbsp; &nbsp; } else {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cookie::queue(Cookie::make(&#39;_pro_his&#39;, $product_id, 525600));\r\n&nbsp; &nbsp; &nbsp; &nbsp; }\r\n&nbsp; &nbsp; &nbsp; &nbsp; $objItemProduct = $this-&gt;objmAcpIndex-&gt;getItemAd($id);\r\n&nbsp; &nbsp; &nbsp; &nbsp; return view(&#39;vpublic.detox.pdshop.detail&#39;, compact(&#39;objItemProduct&#39;));\r\n&nbsp; &nbsp; }\r\n// Ở phi&ecirc;n bản laravel n&agrave;y khi getCookie sẻ bị m&atilde; h&oacute;a bạn cần 1 funcion để decode khi getCookie\r\nprotected function __decryptp($cookie)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; $encrypted = encrypt($cookie);\r\n&nbsp; &nbsp; &nbsp; &nbsp; $decrypted = decrypt($encrypted);\r\n&nbsp; &nbsp; &nbsp; &nbsp; return $decrypted;\r\n&nbsp; &nbsp; }<!--ể-->\r\n</pre>', 1, 'PLQ0G9nzaxv7gCd3bH012E01g6t0nxrMyZjraxM0.png', 0, 1, 1, '2018-09-05 08:00:23', '2018-08-23 01:38:12', NULL),
  (16, 'Xử lý dữ liệu - Collection trong Laravel', 'Khi sử dụng Eloquent của Laravel, lúc ta truy vấn trả về một danh sách bản ghi, thì chúng là tập hợp của các Object Eloquent, và đó chính là Collection', '<p>Khi sử dụng Eloquent của Laravel, l&uacute;c ta truy vấn trả về một danh s&aacute;ch bản ghi, th&igrave; ch&uacute;ng l&agrave; tập hợp của c&aacute;c Object Eloquent, v&agrave; đ&oacute; ch&iacute;nh l&agrave; Collection. Trong Laravel, c&oacute; một Object chuy&ecirc;n để xử l&yacute; Collection đ&oacute; l&agrave;&nbsp;<code>Illuminate\\Database\\Eloquent\\Collection. Nếu tận dụng tốt việc xử l&iacute; dữ liệu sẽ rất dẽ d&agrave;ng v&agrave; giảm rất nhiều thời gian.</code></p>\r\n\r\n<p><strong>Những method th&ocirc;ng dụng của Collection</strong></p>\r\n\r\n<h4><strong>1. chunk()</strong>: nh&oacute;m một số lượng bản ghi th&agrave;nh c&aacute;c nh&oacute;m nhỏ để thuận tiện cho việc show hoặc xử l&yacute; dữ liệu.</h4>\r\n\r\n<pre>\r\nVD: Ta c&oacute; 1 table product v&agrave; cần show ra 6 sản phẩm nhưng để ph&ugrave; hợp với giao diện cần t&aacute;ch n&oacute; ra th&agrave;nh 2 nh&oacute;m \r\n// Bạn c&oacute; thể lấy như b&igrave;nh thường rồi d&ugrave;ng 2 v&ograve;ng lặp đặt điều kiện để t&aacute;ch 2 nh&oacute;m hoặc c&oacute; thể d&ugrave;ng 2 lệnh truy vấn với method take(), skip hoặc limit() để lấy 2 nh&oacute;m nhưng sẽ kh&ocirc;ng tối ưu\r\n// Nếu d&ugrave;ng chuck th&igrave; sẽ đơn giản như thế n&agrave;y: \r\n public function ColectionChuck()\r\n&nbsp;{\r\n&nbsp; &nbsp; $products = Product::take(6)-&gt;get()-&gt;chunk(3);\r\n&nbsp;}</pre>\r\n\r\n<pre>\r\nCollection {#203 ▼<samp>\r\n  #items: array:2 [▼<samp>\r\n    0 =&gt; Collection {#204 ▶}\r\n    1 =&gt; Collection {#208 ▶}\r\n  </samp>]\r\n</samp>}</pre>\r\n\r\n<h4><strong>2. collapse()</strong>: Ngược lại với chunk()</h4>\r\n\r\n<h4><strong>3. avg(), average(), count(), max(), min(),.. :&nbsp;</strong>Đ&acirc;y l&agrave; h&agrave;m t&iacute;nh to&aacute;n&nbsp;của một trường của to&agrave;n bộ bản ghi trong Collection</h4>\r\n\r\n<pre>\r\n// N&acirc;ng c&aacute;o vd bạn muốn đưa c&aacute;c biểu thức t&iacute;nh to&aacute;n v&agrave;o c&aacute;c h&agrave;m tr&ecirc;n vd muốn t&iacute;nh tổng c&aacute;c gi&aacute; trị (price * discount) của sản phẩm\r\n//  $sumcolumn = Product::get()-&gt;sum(function($t){return $t-&gt;price *( 1 - $t-&gt;discount / 100); });</pre>\r\n\r\n<h4><strong>4. pluck():&nbsp;</strong>Chỉ lấy gi&aacute; trị 1 column</h4>\r\n\r\n<h4><strong>5. isEmpty(), isNotEmpty():</strong> Kiểm tra dữ liệu</h4>\r\n\r\n<h4><strong>6. each():</strong> tương tự foreach ,ch&uacute;ng ta c&oacute; thể th&ecirc;m điều kiện để tho&aacute;t v&ograve;ng lặp</h4>\r\n\r\n<pre>\r\n$getAll = Product::get();\r\n$getAll-&gt;each(function($element, $key){\r\n&nbsp; &nbsp;if ($key == 2) {\r\n&nbsp; &nbsp; &nbsp; return false;\r\n&nbsp; &nbsp;}\r\necho $key, $element-&gt;pname;\r\n});\r\n// Nếu d&ugrave;ng foreach\r\nforeach ($getAll as $key =&gt; $element) {\r\n&nbsp; &nbsp; if ($key == 2) {\r\n&nbsp; &nbsp; &nbsp; &nbsp;break;\r\n&nbsp; &nbsp; }\r\n&nbsp; &nbsp; echo $key, $element-&gt;pname;\r\n}\r\n</pre>\r\n\r\n<h4><strong>7. every():</strong> Kiểm tra điều kiện v&agrave; trả về true/false của tất cả bản ghi</h4>\r\n\r\n<pre>\r\n$getAll = Product::get();\r\n$result = $getAll-&gt;every(function($element, $key){\r\n&nbsp; &nbsp;return $element-&gt;price &gt; 100000;&nbsp;\r\n});\r\ndd($result);\r\n// true : nếu tất cả price &gt; 100000\r\n// false : nếu bất k&igrave; 1 price &lt; 100000</pre>\r\n\r\n<p><strong>8. filter(): </strong>lọc bản ghi theo&nbsp;điều kiện</p>\r\n\r\n<pre>\r\n$getAll = Product::get();\r\n$result = $getAll-&gt;filter(function($element, $key){\r\n&nbsp; &nbsp;return $element-&gt;price &gt; 100000;&nbsp;\r\n});\r\ndd($result);\r\n// chỉ lấy bản ghi c&oacute; price &gt; 100000</pre>\r\n\r\n<p><strong>9. map():</strong> tạo 1 collection mới dựa&nbsp;v&agrave;o collection cũ</p>\r\n\r\n<pre>\r\n$getAll = Product::get();\r\n$result = $getAll-&gt;map(function($element, $key){\r\n&nbsp; &nbsp; $element-&gt;price -= 10000;&nbsp;\r\n&nbsp; &nbsp; return $element;&nbsp;\r\n});\r\ndd($result);\r\n// giảm gi&aacute; mỗi sp 10000\r\n</pre>\r\n\r\n<p><strong>10. partition(): </strong>t&aacute;ch th&agrave;nh&nbsp;2 collection với điều&nbsp;ki&ecirc;n n&agrave;o đ&oacute;</p>\r\n\r\n<pre>\r\nlist($expensive, $cheap) = $getAll-&gt;partition(function ($product) {\r\n    return $product-&gt;price &gt;= 100000;\r\n});</pre>\r\n\r\n<p><strong>11. Tổng hợp c&aacute;c method:</strong></p>\r\n\r\n<ul>\r\n	<li>Nh&oacute;m c&aacute;c phương thức sử dụng cho t&igrave;m kiếm dữ liệu trong tập dữ liệu: contains(), where(), search(), has().</li>\r\n	<li>Nh&oacute;m c&aacute;c phương thức lọc dữ liệu: filter(), all()</li>\r\n	<li>Nh&oacute;m c&aacute;c phương thức t&aacute;ch gh&eacute;p, so s&aacute;nh tập dữ liệu:&nbsp;take(), chunk(), collapse(), combine(), zip(), diff(), implode(), merge(), reverse(), split(), union()</li>\r\n	<li>Nh&oacute;m c&aacute;c phương thức t&iacute;nh to&aacute;n, thống k&ecirc; tập dữ liệu:&nbsp;average(), avg(), max(), min(), sum(), count(), every(), median(), random(), unique()</li>\r\n	<li>Nh&oacute;m c&aacute;c phương thức thực hiện th&ocirc;ng qua lặp c&aacute;c phần tử của tập dữ liệu:&nbsp;map(), transform(), reduce(), each(), flatMap, mapWithKey(), reject()</li>\r\n	<li>Nh&oacute;m c&aacute;c phương thức chuyển đổi dạng dữ liệu:&nbsp;toArray(), toJson()</li>\r\n</ul>', 8, 'tW1W33uLUobEdKgB5J0mVFcEmeDIXU8muxEdUc0T.png', 1, 1, 1, '2018-09-18 01:39:53', '2018-08-23 15:23:13', NULL),
  (17, 'Quản lý sự kiện trong ứng dụng với Laravel Event', 'Quản lý sự kiện trong ứng dụng với Laravel Event', '<p><strong>1. Laravel Event:</strong></p>\r\n\r\n<p>Một sự kiện trong m&aacute;y t&iacute;nh l&agrave; h&agrave;nh động hay một c&aacute;i g&igrave; đ&oacute; xảy ra tại một thời điểm x&aacute;c định bởi một chương tr&igrave;nh m&aacute;y t&iacute;nh v&agrave; c&oacute; thể quản l&yacute; bằng c&aacute;c chương tr&igrave;nh m&aacute;y t&iacute;nh. v&iacute; dụ:</p>\r\n\r\n<ul>\r\n	<li>Một người d&ugrave;ng đăng k&yacute; mới.</li>\r\n	<li>Một th&agrave;nh vi&ecirc;n b&igrave;nh luận...</li>\r\n</ul>\r\n\r\n<p><strong>2. Khả năng của event:</strong></p>\r\n\r\n<ul>\r\n	<li>Laravel Event gi&uacute;p ch&uacute;ng ta t&aacute;ch biệt c&aacute;c th&agrave;nh phần trong ứng dụng, khi một sự kiện xảy ra, sự kiện kh&ocirc;ng cần biết những g&igrave; kh&aacute;c ngo&agrave;i việc thực thi c&ocirc;ng việc của n&oacute;.</li>\r\n	<li>Laravel Event đ&oacute; l&agrave; tăng tốc độ trong xử l&yacute; dữ liệu ứng dụng.</li>\r\n	<li>Tối ưu h&oacute;a code.&nbsp;</li>\r\n</ul>\r\n\r\n<p><strong>3. V&iacute; dụ&nbsp;Event:</strong></p>\r\n\r\n<p>Khi tạo mới một sản phẩm sẽ gửi th&ocirc;ng b&aacute;o&nbsp;đến quản trị vi&ecirc;n.</p>\r\n\r\n<p><strong>Tạo Event:&nbsp;</strong></p>\r\n\r\n<pre>\r\nphp artisan make:event AddProduct\r\n</pre>\r\n\r\n<p>Tạo th&agrave;nh c&ocirc;ng trong app sẽ c&oacute; 1 folder Events\\AddProduct.php</p>\r\n\r\n<pre>\r\n&lt;?php\r\nnamespace App\\Events;\r\n\r\nuse Illuminate\\Broadcasting\\Channel;\r\nuse Illuminate\\Queue\\SerializesModels;\r\nuse Illuminate\\Broadcasting\\PrivateChannel;\r\nuse Illuminate\\Broadcasting\\PresenceChannel;\r\nuse Illuminate\\Foundation\\Events\\Dispatchable;\r\nuse Illuminate\\Broadcasting\\InteractsWithSockets;\r\nuse Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast;\r\nuse App\\Model\\Product;\r\n\r\nclass AddProduct\r\n{\r\n&nbsp; &nbsp; use Dispatchable, InteractsWithSockets, SerializesModels;\r\n&nbsp;   public $product;\r\n&nbsp; &nbsp; public function __construct(Product $product)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;product = $product;\r\n&nbsp; &nbsp; }\r\n&nbsp; &nbsp; public function broadcastOn()\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; return new PrivateChannel(&#39;channel-name&#39;);\r\n&nbsp; &nbsp; }\r\n}\r\n</pre>\r\n\r\n<p><strong>Tạo Listener: </strong>tương ứng với event AddProduct - C&aacute;c c&ocirc;ng việc kh&aacute;c cần thực hiện khi event xảy ra</p>\r\n\r\n<pre>\r\nphp artisan make:listener SendEmailAddProduct --event=&quot;AddProduct&quot;</pre>\r\n\r\n<p>Tạo th&agrave;nh c&ocirc;ng trong app sẽ c&oacute; 1 folder Listeners\\SendEmailAddProduct.php</p>\r\n\r\n<pre>\r\n&lt;?php\r\nnamespace App\\Listeners;\r\nuse App\\Events\\AddProduct;\r\nuse Illuminate\\Queue\\InteractsWithQueue;\r\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\r\n\r\nclass SendEmailAddProduct\r\n{\r\n&nbsp; &nbsp; public function __construct()\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; //\r\n&nbsp; &nbsp; }\r\n&nbsp; &nbsp; public function handle(AddProduct $event)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; //\r\n&nbsp; &nbsp; }\r\n}\r\n</pre>\r\n\r\n<p><strong>Đăng k&yacute; Event v&agrave; g&aacute;n với Listener:&nbsp;</strong>Mở file EventServiceProvider.php trong app\\Providers th&ecirc;m v&agrave;o thuộc t&iacute;nh $listen</p>\r\n\r\n<pre>\r\nprotected $listen = [\r\n&nbsp; &nbsp;App\\Events\\Event\\AddProduct&#39; =&gt; [\r\n&nbsp; &nbsp; &nbsp; &#39;App\\Listeners\\EventListener\\SendEmailAddProduct&#39;,\r\n&nbsp; &nbsp;],\r\n];</pre>\r\n\r\n<p><strong>Bạn c&oacute; thể tạo 1 c&aacute;ch đơn giản hơn bằng c&aacute;ch tạo biến $listen trong file&nbsp;EventServiceProvider.php trước rồi chạy lệnh:</strong></p>\r\n\r\n<pre>\r\nphp artisan event:generate</pre>\r\n\r\n<p><strong>Ph&aacute;t đi sự kiện:&nbsp;</strong> trong ProductController method addProduct ta sẽ ph&aacute;t event sau khi th&ecirc;m th&agrave;nh c&ocirc;ng v&agrave;o database.</p>\r\n\r\n<pre>\r\n&lt;?php\r\n\r\nnamespace App\\Http\\Controllers;\r\nuse Illuminate\\Http\\Request;\r\nuse App\\Model\\Product;\r\nuse App\\Events\\AddProduct;\r\n\r\nclass ProductController extends Controller\r\n{\r\npublic function addProduct(Request $request)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; $ar = [\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;pname&#39; &nbsp; &nbsp; &nbsp; =&gt; $request-&gt;pname,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;cat_id&#39; &nbsp; &nbsp; &nbsp;=&gt; $request-&gt;cat_id,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;detail&#39; &nbsp; &nbsp;=&gt; $request-&gt;detail,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;active&#39; =&gt; 1,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;price&#39; &nbsp; &nbsp; =&gt; $request-&gt;price,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;discount&#39; &nbsp; &nbsp; =&gt; $request-&gt;discount\r\n&nbsp; &nbsp; &nbsp; &nbsp; ];\r\n&nbsp; &nbsp; &nbsp; &nbsp; $product_id = Product::addItem($ar);\r\n&nbsp; &nbsp; &nbsp; &nbsp; $product = Product::find($product_id);\r\n&nbsp; &nbsp; &nbsp; &nbsp; event(new AddProduct($product));\r\n&nbsp; &nbsp; }\r\n</pre>\r\n\r\n<p>}</p>\r\n\r\n<p>Khi event được gọi đến c&aacute;c c&ocirc;ng việc muốn thực hiện sẽ được đặt trong method handle() trong&nbsp;App\\Listeners\\EventListener\\SendEmailAddProduct</p>\r\n\r\n<pre>\r\npublic function handle(AddProduct $event)\r\n&nbsp;{\r\n//\r\n&nbsp;}</pre>\r\n\r\n<p>&nbsp;</p>', 11, 'kvDnnjhdNqIBpwt1VXIL3YtKZvwxPkIhxFwgnXuj.png', 1, 1, 1, '2018-09-19 02:19:57', '2018-08-24 09:30:06', NULL),
  (18, 'Route trong Laravel - p1', 'Route trong Laravel', '<h3><strong>Route trong laravel?</strong></h3>\r\n\r\n<p>- Route trong Larvel ( c&oacute; thể hiểu l&agrave; đường dẫn hay url )&nbsp;c&oacute; chức năng l&agrave; định ra c&aacute;c dạng resquest.</p>\r\n\r\n<p>- C&aacute;c loại route trong laravel.&nbsp;</p>\r\n\r\n<ul>\r\n	<li><strong>Route::get&nbsp;</strong>nhận resquest với&nbsp;phương thức GET.</li>\r\n	<li><strong>Route::post</strong>&nbsp;nhận resquest với phương thức POST.</li>\r\n	<li><strong>Route::put</strong>&nbsp;nhận resquest với phương thức PUT.</li>\r\n	<li><strong>Route::delete</strong>&nbsp;nhận resquest với phương thức DELETE.</li>\r\n	<li><strong>Route::match</strong>&nbsp;kết hợp nhiều phương phức như POST,GET,PUT,..</li>\r\n	<li><strong>Route::any</strong>&nbsp;nhận tất cả c&aacute;c phương thức.</li>\r\n	<li><strong>Route::group&nbsp;</strong>tạo ra c&aacute;c nh&oacute;m route.</li>\r\n	<li><strong>Route::controller&nbsp;</strong>gọi đến controller tương ứng m&agrave; ch&uacute;ng ta tự định.</li>\r\n	<li><strong>Route::resource&nbsp;</strong>sử dụng với&nbsp;resource&nbsp;controller.</li>\r\n</ul>', 10, 'RBwIdTVdb0ZsLpAWYnv4hWB4hBSUzuQQfWZzK4Ig.png', 0, 1, 1, '2018-09-05 07:57:25', '2018-08-25 10:01:34', NULL);
  INSERT INTO `news` (`id_news`, `name`, `preview_text`, `detail_text`, `id_cat`, `picture`, `count_number`, `confirm`, `id`, `updated_at`, `created_at`, `keyword`) VALUES
  (19, 'Route trong Laravel - p2 : route:resource', 'Route:resource trong Laravel.', '<p>- Route::resource() l&agrave; một chức năng gi&uacute;p ch&uacute;ng ta X&acirc;y dựng RESTful một c&aacute;ch nhanh ch&oacute;ng.</p>\r\n\r\n<p>- Để tạo Một RESTful Controller ch&uacute;ng ta chạy lệnh.</p>\r\n\r\n<pre>\r\nphp artisan make:controller controllerName --resource</pre>\r\n\r\n<p>- Một&nbsp;RESTful Controller sẽ c&oacute; c&aacute;c method sau.</p>\r\n\r\n<ul>\r\n	<li>index(): Hiển thị một danh s&aacute;ch.</li>\r\n	<li>create(): Th&ecirc;m mới.</li>\r\n	<li>store(): Lưu mới.</li>\r\n	<li>show($id): Hiển thị một dữ liệu theo tham số truyền v&agrave;o.</li>\r\n	<li>edit($id): Sửa một dữ liệu theo tham số truyền v&agrave;o.</li>\r\n	<li>update($id):Cập nhật một dữ liệu theo tham số truyền v&agrave;o.</li>\r\n	<li>destroy($id):X&oacute;a một dữ liệu theo tham số truyền v&agrave;o.</li>\r\n</ul>\r\n\r\n<p>-Th&igrave; phương thức cũng như kiểu request của n&oacute; sẽ như sau.</p>\r\n\r\n<pre>\r\nV&iacute; dụ: Route::resource(&#39;/cat&#39;,&#39;CatController&#39;);</pre>\r\n\r\n<table cellpadding=\"10\" style=\"width:100%\">\r\n	<thead>\r\n		<tr>\r\n			<th>Verb</th>\r\n			<th>Path</th>\r\n			<th>Action</th>\r\n			<th>Route Name</th>\r\n		</tr>\r\n	</thead>\r\n	<tbody>\r\n		<tr>\r\n			<td>GET</td>\r\n			<td>/cat</td>\r\n			<td>index</td>\r\n			<td>photo.index</td>\r\n		</tr>\r\n		<tr>\r\n			<td>GET</td>\r\n			<td>/cat/create</td>\r\n			<td>create</td>\r\n			<td>photo.create</td>\r\n		</tr>\r\n		<tr>\r\n			<td>POST</td>\r\n			<td>/cat</td>\r\n			<td>store</td>\r\n			<td>photo.store</td>\r\n		</tr>\r\n		<tr>\r\n			<td>GET</td>\r\n			<td>/cat/{id}</td>\r\n			<td>show</td>\r\n			<td>photo.show</td>\r\n		</tr>\r\n		<tr>\r\n			<td>GET</td>\r\n			<td>/cat/{id}/edit</td>\r\n			<td>edit</td>\r\n			<td>photo.edit</td>\r\n		</tr>\r\n		<tr>\r\n			<td>PUT/PATCH</td>\r\n			<td>/cat/{id}</td>\r\n			<td>update</td>\r\n			<td>photo.update</td>\r\n		</tr>\r\n		<tr>\r\n			<td>DELETE</td>\r\n			<td>/cat/{id}</td>\r\n			<td>destroy</td>\r\n			<td>photo.destroy</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>- Với khai b&aacute;o tr&ecirc;n tất cả c&aacute;c method sẽ được sử dụng.</p>\r\n\r\n<p>- <strong>only:</strong> Trường hợp bạn chỉ muốn sử dụng 1 v&agrave;i method th&ocirc;i bạn chỉ cần th&ecirc;m only trong khai b&aacute;o route</p>\r\n\r\n<pre>\r\nRoute::resource(&#39;cat&#39;,&#39;CatController&#39;)-&gt;only([&#39;index&#39;,&#39;create&#39;,&#39;store&#39;]);\r\n// chỉ sử dụng để hiển thị danh s&aacute;ch v&agrave; chức năng th&ecirc;m.</pre>\r\n\r\n<p>-&nbsp;<strong>except :</strong> Hoặc trường hợp bạn kh&ocirc;ng&nbsp;muốn sử dụng 1 v&agrave;i method th&ocirc;i bạn d&ugrave;ng except&nbsp;trong khai b&aacute;o route</p>\r\n\r\n<pre>\r\nRoute::resource(&#39;cat&#39;,&#39;CatController&#39;)-&gt;except([&#39;destroy&#39;]);\r\n// Kh&ocirc;ng cho thực hiện delete.\r\n</pre>\r\n\r\n<p>-<strong> names:&nbsp;</strong>Nếu muốn đặt lại t&ecirc;n route.</p>\r\n\r\n<pre>\r\nRoute::resource(&#39;cat&#39;,&#39;CatController&#39;)-&gt;names([&#39;created&#39; =&gt; &#39;cat.add&#39;]);\r\n// b&acirc;y giờ muốn gọi đến trang created bạn d&ugrave;ng route(&#39;cat.add&#39;)\r\n</pre>\r\n\r\n<p><strong>- V&iacute; dụ: </strong>Thực hiện chức năng th&ecirc;m, sửa, x&oacute;a v&agrave; truy vấn 1 table( ở đ&acirc;y m&igrave;nh v&iacute; dụ quản l&iacute; danh mục) trong admin.</p>\r\n\r\n<p>Nếu sử dụng chỉ&nbsp;route get v&agrave; post phần route đầy đủ&nbsp;sẽ như sau:</p>\r\n\r\n<pre>\r\n         Route::prefix(&#39;cat&#39;)-&gt;group(function (){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Route::get(&#39;&#39;,[\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;uses&#39; =&gt; &#39;ADCatController@index&#39;,\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;as&#39; &nbsp; =&gt; &#39;admin.adnews.cat.index&#39;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;]);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Route::get(&#39;add&#39;,[\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;uses&#39; =&gt; &#39;ADCatController@getAdd&#39;,\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;as&#39; &nbsp; =&gt; &#39;admin.adnews.cat.add&#39;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;]);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Route::post(&#39;add&#39;,[\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;uses&#39; =&gt; &#39;ADCatController@postAdd&#39;,\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;as&#39; &nbsp; =&gt; &#39;admin.adnews.cat.add&#39;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;]);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Route::get(&#39;edit/{id}&#39;,[\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;uses&#39; =&gt; &#39;ADCatController@getEdit&#39;,\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;as&#39; &nbsp; =&gt; &#39;admin.adnews.cat.edit&#39;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;]);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Route::post(&#39;edit/{id}&#39;,[\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;uses&#39; =&gt; &#39;ADCatController@postEdit&#39;,\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;as&#39; &nbsp; =&gt; &#39;admin.adnews.cat.edit&#39;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;]);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Route::get(&#39;del/{id}&#39;,[\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;uses&#39; =&gt; &#39;ADCatController@del&#39;,\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&#39;as&#39; &nbsp; =&gt; &#39;admin.adnews.cat.del&#39;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;]);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});</pre>\r\n\r\n<p>Việc khai b&aacute;o rất d&agrave;i d&ograve;ng v&agrave; phải lặp đi lặp lại ở c&aacute;c phẩn quản l&iacute; c&aacute;c bảng dữ liệu kh&aacute;c.</p>\r\n\r\n<p>Với route:resource sễ rất đơn giản như sau:</p>\r\n\r\n<pre>\r\nRoute::resource(&#39;cat&#39;,&#39;ADCatController&#39;);</pre>\r\n\r\n<p>Kiểu request, t&ecirc;n của route c&aacute;c phương thức sẽ được tạo mặc định theo như bản tr&ecirc;n. Trường hợp chỉ sử dụng 1 v&agrave;i method bạn c&oacute; thể sử dụng only() hoặc except() hay đổi t&ecirc;n lại route th&igrave; d&ugrave;ng name().</p>\r\n\r\n<p>Hoặc nếu muốn middleware theo từng route trong controller vd: d&ugrave;ng middleware để chỉ cho user thuộc nh&oacute;m admin c&oacute; thể&nbsp;th&ecirc;m, sửa, x&oacute;a danh mục.</p>\r\n\r\n<p>Middleware trong&nbsp;__contruct ADCatController.</p>\r\n\r\n<pre>\r\n    public function __construct(){\r\n&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;middleware(&#39;abmauth:admin&#39;)-&gt;only(&#39;create&#39;, &#39;edit&#39;, &#39;delete&#39;);\r\n&nbsp; &nbsp; }</pre>\r\n\r\n<p>&nbsp;</p>', 10, 'HZ3hpUIjh9mgt3uz1a6xBLUhE9WfCwnnjW5Dzghv.png', 0, 1, 1, '2018-09-05 07:57:13', '2018-08-25 15:40:08', NULL),
  (20, 'Redirect to https', 'Redirect to https', '<p>RewriteEngine On<br />\r\n<br />\r\nRewriteCond %{HTTPS} off<br />\r\nRewriteCond %{HTTP:X-Forwarded-Proto} !https<br />\r\n<br />\r\nRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]</p>', 9, '', 1, 0, 1, '2018-09-05 17:17:25', '2018-08-29 23:26:35', NULL),
  (21, 'Tăng lượt xem bài viết bằng Event Laravel.', 'Tăng lượt xem bài viết bằng Event Laravel.', '<p>Để tăng lượt xem cho 1 b&agrave;i viết bạn c&oacute; thể sử dụng Cookie kiểm tra v&agrave; c&oacute; thể viết ngay trong controller nhưng n&oacute; sẽ l&agrave;m load chi tiết b&agrave;i viết cả bạn chậm hơn c&aacute;ch tối ưu hơn v&agrave; bạn sử dụng event của Laravel để tăng lượt xem cho b&agrave;i viết đ&oacute;.</p>\r\n\r\n<p><strong>1. Tạo Event&nbsp;viewNews v&agrave; Listener IncreamentViewNews:&nbsp;</strong></p>\r\n\r\n<p><a href=\"/quan-ly-su-kien-trong-ung-dung-voi-laravel-event-17.html\">Quản L&yacute; Sự Kiện Trong Ứng Dụng Với Laravel Event</a></p>\r\n\r\n<p>Bạn c&oacute; thể xem lại b&agrave;i viết tạo Event của m&igrave;nh theo link tr&ecirc;n.</p>\r\n\r\n<p><strong>2. Tạo sự kiện trong controller.</strong></p>\r\n\r\n<p>Trong controller method detail bạn cần ph&aacute;t đi sự kiện để tăng view.</p>\r\n\r\n<pre>\r\npublic function detail($id)\r\n{\r\n// code detail\r\nevent(new viewNews($id));\r\n}\r\n</pre>\r\n\r\n<p><strong>3. Handle trong Listeners</strong></p>\r\n\r\n<p>Đ&acirc;y l&agrave; phần tăng view cho b&agrave;i viết, cũng tương đối dễ hiểu bạn c&oacute; thể t&igrave;m hiểu v&agrave; tối ưu th&ecirc;m phần n&agrave;y.</p>\r\n\r\n<pre>\r\npublic function handle(viewNews $event)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; $id = $event-&gt;id;\r\n&nbsp; &nbsp; &nbsp; &nbsp; if (Cookie::has(&#39;_ninhnghiait_his&#39;)) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_pro_his = $this-&gt;__decryptp(Cookie::get(&#39;_ninhnghiait_his&#39;));\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_ar_pro_his = explode(&#39;,&#39;, $_pro_his);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!in_array($id, $_ar_pro_his)) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array_unshift($_ar_pro_his, $id);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_pro_his = implode(&#39;,&#39;, $_ar_pro_his);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cookie::queue(Cookie::make(&#39;_ninhnghiait_his&#39;, $_pro_his, 43200));\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $mNENews = new NENews();\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $mNENews-&gt;incrementView($id);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }\r\n&nbsp; &nbsp; &nbsp; &nbsp; } else {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cookie::queue(Cookie::make(&#39;_ninhnghiait_his&#39;, $id, 43200));\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $mNENews = new NENews();\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $mNENews-&gt;incrementView($id);\r\n&nbsp; &nbsp; &nbsp; &nbsp; }\r\n&nbsp; &nbsp; &nbsp; &nbsp; return true;\r\n&nbsp; &nbsp; }\r\n&nbsp; &nbsp; protected function __decryptp($cookie)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; $encrypted = encrypt($cookie);\r\n&nbsp; &nbsp; &nbsp; &nbsp; $decrypted = decrypt($encrypted);\r\n&nbsp; &nbsp; &nbsp; &nbsp; return $decrypted;\r\n&nbsp; &nbsp; }</pre>', 11, 'bhpa4FUpDI37UrkwXiXWXd2EsGhGXbOZxiYrNN7n.png', 2, 1, 1, '2018-09-19 02:19:26', '2018-09-02 04:02:38', NULL),
  (22, 'Laravel Form validation - p1', 'Laravel Form validation', '<p>Laravel cung cấp rất nhiều c&aacute;ch thức để kiểm tra th&ocirc;ng tin nhập tr&ecirc;n c&aacute;c form nhập liệu, ơ phần n&agrave;y m&igrave;nh sẽ&nbsp;giới thiệu c&aacute;ch kiểm tra nhập liệu bằng Validator cua Laravel.</p>\r\n\r\n<p>Danh s&aacute;ch c&aacute;c rule bạn c&oacute; thể t&igrave;m hiểu tr&ecirc;n laravel.com nh&eacute;.&nbsp;Số lượng c&aacute;c validate rule l&agrave; rất nhiều, đủ cho ch&uacute;ng ta kiểm tra dữ liệu c&aacute;c dạng th&ocirc;ng tin nhập liệu.</p>\r\n\r\n<p>M&igrave;nh sẽ l&agrave;m 1 v&iacute; dụ&nbsp;để dễ hiểu hơn nh&eacute;.&nbsp;</p>\r\n\r\n<p>Một form đăng k&iacute; th&agrave;nh vi&ecirc;n đơn giản:</p>\r\n\r\n<p><strong>View:</strong></p>\r\n\r\n<pre>\r\n...\r\n&nbsp; @if ($errors-&gt;any())\r\n&nbsp; &nbsp; &nbsp; &lt;div class=&quot;alert alert-danger&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;ul&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @foreach ($errors-&gt;all() as $error)\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;li&gt;{{ $error }}&lt;/li&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @endforeach\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/ul&gt;\r\n&nbsp; &nbsp; &nbsp; &lt;/div&gt;\r\n&nbsp; &nbsp; @endif\r\n&nbsp; &nbsp; @if (Session::has(&#39;msg&#39;))\r\n&nbsp; &nbsp; &nbsp; &lt;div class=&quot;alert alert-success&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; {{ Session(&#39;msg&#39;) }}\r\n&nbsp; &nbsp; &nbsp; &lt;/div&gt;\r\n&nbsp; &nbsp; @endif\r\n&nbsp; &nbsp; &nbsp; &lt;form action=&quot;{{route(&#39;register.demo&#39;)}}&quot; method=&quot;post&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; @csrf\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class=&quot;form-group&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;label for=&quot;name&quot;&gt;T&ecirc;n đăng nhập&lt;/label&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;text&quot; name=&quot;name&quot; class=&quot;form-control&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;/div&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class=&quot;form-group&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;label for=&quot;email&quot;&gt;Email&lt;/label&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;email&quot; name=&quot;email&quot; class=&quot;form-control&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;/div&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class=&quot;form-group&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;label for=&quot;password&quot;&gt;Mật khẩu&lt;/label&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;password&quot; name=&quot;password&quot; class=&quot;form-control&quot; id=&quot;password&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;/div&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class=&quot;form-group&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;label for=&quot;password_comfirmation&quot;&gt;Nhập lại mật khẩu&lt;/label&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;password&quot; name=&quot;password_comfirmation&quot; class=&quot;form-control&quot; id=&quot;password_confirmation&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;/div&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class=&quot;form-group&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;submit&quot; value=&quot;Register&quot;&gt;\r\n&nbsp; &nbsp; &nbsp; &lt;/form&gt;\r\n&nbsp; &nbsp; &lt;/div&gt;\r\n&nbsp; ...</pre>\r\n\r\n<p>$errors : hiển thị c&aacute;c lỗi khi validate. $msg : hiển thị th&ocirc;ng b&aacute;o khi validate th&agrave;nh c&ocirc;ng.&nbsp;</p>\r\n\r\n<p><strong>Controller:</strong></p>\r\n\r\n<pre>\r\nC1:\r\nuse Validator;\r\n...\r\npublic function store(Request $request)\r\n&nbsp; &nbsp; {\r\n        $rules = [\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;name&#39; &nbsp; &nbsp; =&gt; &#39;required|max:255&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;email&#39; &nbsp; &nbsp;=&gt; &#39;required|email&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;password&#39; =&gt; &#39;required|min:6|confirmed&#39;\r\n&nbsp; &nbsp; &nbsp; &nbsp; ];\r\n&nbsp; &nbsp; &nbsp; &nbsp; $attributes = [\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;required&#39; &nbsp;=&gt; &#39;:attribute kh&ocirc;ng được để trống&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;email&#39; &nbsp; &nbsp; =&gt; &#39;:attribute kh&ocirc;ng được để trống&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;min&#39; &nbsp; &nbsp; &nbsp; =&gt; &#39;:attribute kh&ocirc;ng được để trống&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;max&#39; &nbsp; &nbsp; &nbsp; =&gt; &#39;:attribute kh&ocirc;ng được để trống&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;confirmed&#39; =&gt; &#39;:attribute nhập lại kh&ocirc;ng đ&uacute;ng&#39;\r\n&nbsp; &nbsp; &nbsp; &nbsp; ];\r\n&nbsp; &nbsp; &nbsp; &nbsp; $messages = [\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;name&#39; &nbsp; &nbsp; =&gt; &#39;T&ecirc;n đăng nhập&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;email&#39; &nbsp; &nbsp;=&gt; &#39;Email&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;password&#39; =&gt; &#39;Mật khẩu&#39;\r\n&nbsp; &nbsp; &nbsp; &nbsp; ];\r\n&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;$validator = Validator::make($request-&gt;all(), $rules, $attributes , $messages);\r\n&nbsp; &nbsp; &nbsp; &nbsp; if ($validator-&gt;fails()) {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return redirect()-&gt;route(&#39;register.form&#39;)-&gt;withErrors($validator);\r\n&nbsp; &nbsp; &nbsp; &nbsp; } else {\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;// add database\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;return redirect()-&gt;route(&#39;register.form&#39;)-&gt;with(&#39;msg&#39;, &#39;Đăng k&yacute; th&agrave;nh c&ocirc;ng.&#39;);\r\n&nbsp; &nbsp; &nbsp; &nbsp; }\r\n&nbsp; &nbsp; }\r\nC2: hoặc bạn c&oacute; thể d&ugrave;ng $request-&gt;validate($rules, $attributes, $messages);\r\n// với c&aacute;ch n&agrave;y n&oacute; sẽ tự chuyển về trang nhập với th&ocirc;ng b&aacute;o lỗi m&agrave; kh&ocirc;ng cần if(...fails())</pre>\r\n\r\n<p><strong>* Nếu bạn muốn th&ecirc;m 1 th&ocirc;ng b&aacute;o lỗi khi fails:</strong></p>\r\n\r\n<pre>\r\nVới C1:\r\nif ($validator-&gt;fails()) {\r\n&nbsp;   $validator-&gt;errors()-&gt;add(&#39;msg&#39;, &#39;Dữ liệu nhập kh&ocirc;ng đ&uacute;ng!&#39;);\r\n &nbsp; &nbsp;return redirect()-&gt;route(&#39;register.form&#39;)-&gt;withErrors($validator); &nbsp; &nbsp; &nbsp; &nbsp; \r\n}\r\n</pre>\r\n\r\n<p><strong>* Nếu bạn muốn hiển thị th&ocirc;ng b&aacute;o lỗi ri&ecirc;ng lẻ giống với jquery validation th&igrave; d&ugrave;ng:</strong></p>\r\n\r\n<pre>\r\nvd: lấy th&ocirc;ng b&aacute;o username\r\n@if($errors-&gt;has(&#39;name&#39;))\r\n{{$errors-&gt;first(&#39;name&#39;)}}\r\n@endif</pre>', 12, 'uLkLldvJ7DU31ozdpBLTm06uBH4OagifhBl3oFlc.png', 0, 1, 1, '2018-09-06 11:12:41', '2018-09-02 14:10:48', NULL),
  (23, 'Laravel Form validation - p2', 'Laravel Form validation - p2', '<p>Laravel đ&atilde; hổ trợ gi&uacute;p t&aacute;ch ri&ecirc;ng phần validation để quản l&iacute; code tốt hơn với class FormRequest.</p>\r\n\r\n<p>File n&agrave;y sẽ nằm ở app/Http/Request</p>\r\n\r\n<p>Với vd giống b&agrave;i trước.</p>\r\n\r\n<p>1. Tạo RegisterRequest bằng lệnh</p>\r\n\r\n<pre>\r\n<code>php artisan make:request </code>RegisterRequest\r\n// n&ecirc;n th&ecirc;m hậu tố Request để dễ quản l&iacute;.\r\n&lt;?php\r\nnamespace App\\Http\\Requests;\r\nuse Illuminate\\Foundation\\Http\\FormRequest;\r\n\r\nclass RegisterRequest extends FormRequest\r\n{\r\n&nbsp; &nbsp; public function authorize()\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; return false;\r\n&nbsp; &nbsp; }\r\n&nbsp; &nbsp; public function rules()\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; return [\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //\r\n&nbsp; &nbsp; &nbsp; &nbsp; ];\r\n&nbsp; &nbsp; }\r\n}\r\n// với c&aacute;c method rules, attributes, messages tương tự b&agrave;i trước.\r\n</pre>\r\n\r\n<p>Việc cần l&agrave;m đơn giản chỉ cần thay class Request bằng&nbsp;RegisterRequest trong method cần validate trong controller</p>\r\n\r\n<pre>\r\npublic function store(RegisterRequest $request)\r\n{\r\n&nbsp; &nbsp;// code&nbsp;&nbsp;\r\n}</pre>', 1, 'dRKZJfsmoarnApG5yAhaNKilnH9hWy9YqqvXPTGE.png', 0, 1, 1, '2018-09-06 11:28:53', '2018-09-06 11:13:10', NULL),
  (24, 'Một số tip nhỏ khi validation trong laravel', 'Một số tip nhỏ khi validation trong laravel', '<p><strong>1.&nbsp;prepareForValidation: </strong></p>\r\n\r\n<p>Khi bạn muốn validate 1 trường được custom dựa tr&ecirc;n trường s&atilde;n c&oacute; trong form. vd: ta c&oacute; table chứa c&aacute;c field name v&agrave; code với code =&nbsp;str_slug($name) v&agrave; code n&agrave;y l&agrave; unique.</p>\r\n\r\n<p>Trong khi form nhập chỉ nhập gi&aacute; trị name th&igrave; bạn kh&ocirc;ng thể validate với rules</p>\r\n\r\n<pre>\r\n &#39;code&#39; =&gt;&nbsp;&#39;unique:tablename&#39;</pre>\r\n\r\n<p>Vậy bạn cần sử dụng method<strong>&nbsp;</strong>prepareForValidation() để tạo 1 field code trước khi validate.</p>\r\n\r\n<pre>\r\nprotected function prepareForValidation()\r\n{\r\n&nbsp; if ($this-&gt;has(&#39;name&#39;)) $this-&gt;merge([&#39;code&#39;=&gt;str_slug($this-&gt;name)]);\r\n}</pre>\r\n\r\n<p>Sau đ&oacute; chỉ cần validate b&igrave;nh thường với rules như tr&ecirc;n.</p>\r\n\r\n<p><strong>2. Unique khi update:&nbsp;</strong></p>\r\n\r\n<p>Khi 1 field trong table c&oacute; thuộc t&iacute;nh unique vd như bảng users c&oacute; email.</p>\r\n\r\n<p>Khi create 1 d&ograve;ng dữ liệu việc validate field&nbsp;rất dễ d&agrave;ng&nbsp;</p>\r\n\r\n<pre>\r\n&#39;email&#39; =&gt;&nbsp;&#39;unique:users&#39;</pre>\r\n\r\n<p>Nhưng khi update bạn kh&ocirc;ng thể d&ugrave;ng như tr&ecirc;n v&igrave; nếu người d&ugrave;ng kh&ocirc;ng thay đổi email chỉ thay đổi field kh&aacute;c th&igrave; n&oacute; sẽ b&aacute;o lỗi email đ&atilde; bị tr&ugrave;ng (ở đ&acirc;y tr&ugrave;ng với ch&iacute;nh dữ liệu của ch&iacute;nh người d&ugrave;ng đ&oacute;), vậy khi validate bạn phải loại trừ trường hợp email tr&ugrave;ng với email ban đầu.&nbsp;</p>\r\n\r\n<pre>\r\nC1: bạn lấy email từ database của người d&ugrave;ng đang update rồi  kiểm tra với email mới nhập nếu tr&ugrave;ng nhau th&igrave; kh&ocirc;ng validate field &#39;email&#39; =&gt; &#39;unique&#39;. Nhưng c&aacute;ch n&agrave;y code kh&aacute; d&agrave;i.\r\nC2: Vẫn validate b&igrave;nh thường nhưng bạn phải th&ecirc;m tham số\r\n    public function rules(Request $request)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; $id = &nbsp;$request-&gt;id;\r\n&nbsp; &nbsp; &nbsp; &nbsp; return [\r\n            // Nếu t&ecirc;n primaryKey l&agrave; id\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;email&#39; =&gt; &quot;$required|unique:users,email,&quot;.$id\r\n&nbsp;           // Nếu t&ecirc;n primaryKey kh&ocirc;ng l&agrave; id vd: user_id\r\n&nbsp;           &#39;email&#39; =&gt; &quot;$required|unique:users,email,&quot;.$id.&quot;,user_id&quot;\r\n&nbsp; &nbsp; &nbsp; &nbsp; ];\r\n&nbsp; &nbsp; }\r\n// đơn giản hơn c1 nhiều\r\n</pre>', 12, 'aL8WcRrwcEWU0a0toXLGf31545vRWwLJ2EeJJIH2.png', 0, 0, 1, '2018-09-07 03:38:58', '2018-09-07 03:38:49', NULL),
  (25, 'Giới thiệu framework Vue.js', 'Giới thiệu framework Vue.js', '<h2>1. Vue.js:</h2>\r\n\r\n<p>Vue&nbsp;l&agrave; một framework Javascript ti&ecirc;n tiến trong x&acirc;y dựng giao diện người d&ugrave;ng.&nbsp;Vue&nbsp;cũng c&oacute; khả năng cung cấp c&aacute;c ứng dụng web đơn trang singel Page Application(to&agrave;n bộ website chỉ l&agrave; một trang) cho ph&eacute;p kết hợp với nhiều c&aacute;c c&ocirc;ng cụ hiện đại, như Laravel.</p>\r\n\r\n<h2>2. M&ocirc; h&igrave;nh MVVM:</h2>\r\n\r\n<p><strong>Model-View-ViewModel hay c&ograve;n gọi l&agrave;&nbsp;</strong>&nbsp;two-way data binding<strong>&nbsp;</strong>&nbsp;dữ liệu mỗi khi được &ldquo;g&aacute;n&rdquo; v&agrave;o View hoặc Model sẽ đều được Vue.js tự động gắn cho phần c&ograve;n lại. Tức l&agrave; khi dữ liệu thay đổi ở Model n&oacute; sẽ tự động được &ldquo;cập nhật&rdquo; sang View v&agrave; khi người d&ugrave;ng thay đổi dữ liệu tr&ecirc;n View (v&iacute; dụ nhập liệu v&agrave;o &ocirc; địa chỉ email chẳng hạn) th&igrave; dữ liệu cũng được tự động cập nhật ngược lại Model. Vd:</p>\r\n\r\n<pre>\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n    &lt;title&gt;V&iacute; dụ Vue.js&lt;/title&gt;\r\n&lt;/head&gt;\r\n&lt;body&gt;\r\n    &lt;div id=&quot;vue&quot;&gt;\r\n        &lt;input v-model=&quot;content&quot;&gt;\r\n&nbsp;       &lt;p style=&quot;border: 2px solid; padding:5px;&quot;&gt;{{content}}&lt;/p&gt;\r\n    &lt;/div&gt;\r\n    &lt;script src=&quot;https://vuejs.org/js/vue.min.js&quot;&gt;&lt;/script&gt;\r\n    &lt;script&gt;\r\n        new Vue({\r\n            el: &#39;#vue&#39;,\r\n            data: {\r\n                content: &#39;Hello World!&#39;\r\n            }\r\n        })\r\n    &lt;/script&gt;\r\n&lt;/body&gt;\r\n&lt;/html&gt;</pre>\r\n\r\n<p>Khi bạn thay đổi dữ liệu thẻ input dữ liệu trong thẻ p cũng sẽ thay đổi theo. Nếu d&ugrave;ng jquery bạn cần bắt sự kiện rồi g&aacute;n gi&aacute; trị cho thẻ p nhưng nếu muốn g&aacute;n gi&aacute; trị cho 1000 thẻ p th&igrave; jquery sẽ c&oacute; vấn đề nhưng với vue th&igrave; d&ugrave; 1 hay 1000 cũng kh&ocirc;ng kh&aacute;c biệt lớn.&nbsp;</p>', 13, 'lkbb1HZllV77zilbnW6iNPwMOLfzTpzbUVEN9r2A.jpeg', 1, 1, 1, '2018-09-12 03:30:34', '2018-09-10 16:12:41', NULL),
  (26, 'Câu lệnh trong Vue.js', 'Câu lệnh trong Vue.js', '<h2>1. C&acirc;u lệnh cơ bản:</h2>\r\n\r\n<pre>\r\n    &lt;div id=&quot;app&quot;&gt;\r\n&nbsp;       // {{..}} : in 1 biểu thức ra m&agrave;n h&igrave;nh.\r\n        &lt;h2&gt;{{ message }}&lt;/h2&gt;\r\n\r\n&nbsp;       // @{{..}} : in 1 biểu thức ra m&agrave;n h&igrave;nh trong blade tempalte của Laravel.\r\n&nbsp;       &lt;h2&gt;@{{ message }}&lt;/h2&gt;\r\n\r\n&nbsp;       // Th&ecirc;m thuộc t&iacute;nh v-html=&quot;mesages_html&quot; : nếu muốn in gi&aacute; trị html tương tự {!!...!!} laravel.\r\n&nbsp;       &lt;h2 v-html=&#39;mesages_html&#39;&gt;&lt;/h2&gt;\r\n&nbsp;       // C&oacute; thể in cả gi&aacute; trị biểu thức: {{ a * b }} hoặc {{ one == 1 ? &#39;One&#39; : &#39;Two&#39; }}\r\n        &lt;h2&gt;{{ a * b }}&lt;/h2&gt;\r\n&nbsp;       &lt;h2&gt;{{ one == 1 ? &#39;One&#39; : &#39;Two&#39; }}&lt;/h2&gt;\r\n\r\n&nbsp;        // Lưu &yacute;: kh&ocirc;ng thể in trực tiếp gi&aacute; trị vue v&agrave;o gi&aacute; trị của thuộc t&iacute;nh thẻ html m&agrave; phải th&ocirc;ng qua c&acirc;u lệnh v-bind:property=&#39;..&#39;\r\n&nbsp;       &lt;img v-bind:src=&quot;image&quot;  /&gt;\r\n&nbsp;       Hoặc gọn hơn: &lt;img :src=&quot;image&quot; /&gt;\r\n&nbsp;       // để gọi sự kiện ta d&ugrave;ng v:on:property=&quot;...&quot;\r\n&nbsp;       &lt;a href=&quot;#&quot; v-on:click=&#39;function&#39; &gt;On&lt;/a&gt;\r\n&nbsp;       Hoặc &lt;a href=&quot;#&quot; @click=&#39;function&#39; &gt;On&lt;/a&gt;\r\n        &lt;input v-model=&quot;message&quot;&gt;\r\n    &lt;/div&gt;\r\n    &lt;script src=&quot;https://vuejs.org/js/vue.min.js&quot;&gt;&lt;/script&gt;\r\n    &lt;script type=&quot;text/javascript&quot;&gt;\r\n&nbsp;       \r\n        new Vue({\r\n            el: &#39;#app&#39;,\r\n            data: {\r\n                message: &#39;Hello World!&#39;,\r\n&nbsp;               mesages_html: &#39;Hello &lt;strong&gt; World!&lt;/strong&gt;&#39;,\r\n                a : 5,\r\n&nbsp;               b : 10,\r\n&nbsp;               one : 1\r\n            }\r\n        })\r\n    &lt;/script&gt;\r\n&nbsp;   \r\n&nbsp;</pre>\r\n\r\n<p>&nbsp;</p>', 13, 'ZfEjvBxaqlW5taxQcmPfvxFc4QsFZh6xYNkwjwEp.jpeg', 1, 1, 1, '2018-09-16 04:37:49', '2018-09-15 02:15:28', NULL),
  (27, 'Hiển thị hình ảnh vừa upload bằng thẻ input type=\"file\"', 'Hiển thị hình ảnh vừa upload bằng thẻ input type=\"file\"', '<p>Hiển thị h&igrave;nh ảnh vừa upload bằng thẻ input gi&uacute;p người d&ugrave;ng xem trước h&igrave;nh ảnh tr&aacute;nh nhầm lẫn khi upload.&nbsp; Nhớ nh&uacute;ng thư viện jQuery khi sử dụng nh&eacute;.</p>\r\n\r\n<pre>\r\n\r\n&nbsp; &nbsp;&lt;input type=&#39;file&#39; onchange=&quot;readURL(this);&quot; /&gt;&lt;hr&gt;\r\n&nbsp; &nbsp;&lt;img id=&quot;img&quot; src=&quot;#&quot; alt=&quot;your image&quot; /&gt;\r\n&lt;script&gt;\r\n&nbsp; $(&#39;#img&#39;).hide();\r\n&nbsp; function readURL(input) {\r\n&nbsp; if (input.files &amp;&amp; input.files[0]) {\r\n&nbsp; &nbsp; var reader = new FileReader();\r\n&nbsp; &nbsp; reader.onload = function (e) {\r\n&nbsp; &nbsp; &nbsp; $(&#39;#img&#39;).show()\r\n&nbsp; &nbsp; &nbsp; &nbsp; .attr(&#39;src&#39;, e.target.result)\r\n&nbsp; &nbsp; &nbsp; &nbsp; .width(150)\r\n&nbsp; &nbsp; &nbsp; &nbsp; .height(200);\r\n&nbsp; &nbsp; };\r\n&nbsp; &nbsp; reader.readAsDataURL(input.files[0]);\r\n&nbsp; }\r\n&nbsp; }\r\n&lt;/script&gt;</pre>', 15, 'K57AeXXtaURxVlaXjgYpppKTI1JDc1CwRXDQ8k81.png', 1, 1, 1, '2018-10-15 04:26:31', '2018-09-16 15:06:12', NULL),
  (28, 'dsds', 'dsds', '<p>return $this-&gt;hasMany(UseR::class)-&gt;whereHas(&#39;roles&#39;, function ($query) { $query-&gt;where(&#39;role&#39;, &#39;like&#39;, &#39;foo%&#39;); })-&gt;get();</p>', 8, '', 1, 0, 1, '2018-09-18 01:39:32', '2018-09-17 02:52:07', NULL),
  (29, 'Mẹo giúp code Jquery tốt hơn.', 'Mẹo giúp code Jquery tốt hơn.', '<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" class=\"table table-hover\">\r\n	<tbody>\r\n		<tr>\r\n			<td>1.&nbsp;</td>\r\n			<td>\r\n			<pre>\r\n<code>$(document).ready(function() {\r\n}</code></pre>\r\n			</td>\r\n			<td>\r\n			<pre>\r\n<code>$(function(){\r\n});</code></pre>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>2.</td>\r\n			<td>disable click chuột phải</td>\r\n			<td>\r\n			<pre>\r\n<code>$(document).bind(&quot;contextmenu&quot;,function(e){\r\n    return false;\r\n});</code></pre>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>3</td>\r\n			<td>Nối chuỗi&nbsp;</td>\r\n			<td>\r\n			<pre>\r\n<code>[&#39;A&#39;, &#39;B&#39;, &#39;C&#39;].join(&#39; &#39;);</code></pre>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>4</td>\r\n			<td>H&agrave;m c&oacute; điều kiện trả về</td>\r\n			<td>\r\n			<pre>\r\nfunction test(a) {\r\nreturn a&nbsp;|| null; // if (a) { return a} else { return null;}&nbsp;\r\n			}</pre>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>5</td>\r\n			<td>Kiểm tra điều kiện</td>\r\n			<td>\r\n			<pre>\r\na &amp;&amp; alert(a); \r\n\r\n\r\n			// if(a) { alert(a) ;}</pre>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>6.&nbsp;</td>\r\n			<td>Sử dụng template</td>\r\n			<td>\r\n			<pre>\r\nvar text = &#39;Hi, {name}!&#39;;\r\n\r\n\r\n			var reText =&nbsp;text <code>.replace(&#39;{</code>name<code>}&#39;, Laravel);</code></pre>\r\n			</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p>&nbsp;</p>', 16, '', 1, 1, 1, '2018-10-22 09:18:02', '2018-10-01 17:16:34', NULL),
  (30, 'Laravel Authentication p1', 'Laravel Authentication xác thực người dùng', '<p>Trước đ&acirc;y, để viết một t&iacute;nh năng x&aacute;c thực người d&ugrave;ng l&agrave; mất rất nhiều c&ocirc;ng sức, nhưng Laravel đ&atilde; hổ trợ ch&uacute;ng ta tất cả,&nbsp;mọi việc b&acirc;y giờ&nbsp;trở n&ecirc;n rất đơn&nbsp;giản.</p>\r\n\r\n<p>Laravel đ&atilde; tạo sẵn c&aacute;c Controller, View, Middleware, Model&hellip; v&agrave; cả file cấu h&igrave;nh config/auth.php để ch&uacute;ng ta chỉ cần thiết lập l&agrave; c&oacute; thể chạy được ngay.</p>\r\n\r\n<h3>1. Config/auth.php:</h3>\r\n\r\n<p>Thiết lập cấu h&igrave;nh cho Laravel Authentication.</p>\r\n\r\n<p>+ Guards định nghĩa c&aacute;ch thức x&aacute;c thực người d&ugrave;ng.</p>\r\n\r\n<p>+ Providers định nghĩa c&aacute;c c&aacute;ch thức lưu trữ v&agrave; lấy dữ liệu để x&aacute;c thực người d&ugrave;ng.</p>\r\n\r\n<h3>2. Controller</h3>\r\n\r\n<p>Laravel cũng tạo ra một loạt c&aacute;c Controller trong app\\Http\\Controllers\\Auth như:</p>\r\n\r\n<ul>\r\n	<li>RegisterController: Quản l&yacute; việc đăng k&yacute; th&agrave;nh vi&ecirc;n mới.</li>\r\n	<li>LoginController: Quản l&yacute; việc đăng nhập c&aacute;c th&agrave;nh vi&ecirc;n.</li>\r\n	<li>ForgotPasswordController: gửi email với đường link sử dụng cho reset password.</li>\r\n	<li>ResetPasswordController: kiểm so&aacute;t việc reset mật khẩu với c&aacute;c logic do lập tr&igrave;nh vi&ecirc;n th&ecirc;m v&agrave;o.</li>\r\n</ul>\r\n\r\n<h3>3. X&aacute;c thực bằng Laravel Authentication</h3>\r\n\r\n<p><strong>3.1.&nbsp;sử dụng lệnh artisan sau:</strong>&nbsp;&nbsp;</p>\r\n\r\n<pre>\r\nphp artisan make:auth\r\n//Trong route/web.php laravel sẽ th&ecirc;m 2 đoạn code\r\nAuth::routes();\r\nRoute::get(&#39;/home&#39;, &#39;HomeController@index&#39;)-&gt;name(&#39;home&#39;); // mặc định khi login th&agrave;nh c&ocirc;ng sẽ redirect đến &#39;/home&#39;\r\nTiếp theo chạy lệnh php artisan migrate để tạo c&aacute;c table trong database\r\nNếu th&agrave;nh c&ocirc;ng trong database sẽ c&oacute; th&ecirc;m 3 bảng user, password_resets, migrations.\r\nTuy nhi&ecirc;n nếu lỗi c&oacute; thể thuộc c&aacute;c trường hợp sau:\r\n+ Nếu database đ&atilde; c&oacute; c&aacute;c bảng tr&ecirc;n n&ecirc;n x&oacute;a rồi chạy lại lệnh.\r\n+ SQLSTATE[42000] : lỗi n&agrave;y do bạn sử dụng laravel 5.7.7 trở xuống do laravel 5.4 đ&atilde; thay đổi character mặc định sang utf8mb4&nbsp;để khắc phục bạn th&ecirc;m đoạn code n&agrave;y Schema::defaultStringLength(191); v&agrave;o function boot() trong AppServiceProvider.php</pre>\r\n\r\n<p>B&acirc;y giờ xem Laravel Authentication hỗ trợ những g&igrave;.</p>\r\n\r\n<p><strong>3.2 Register:&nbsp;</strong></p>\r\n\r\n<p>V&agrave;o đường dẫn dự &aacute;n th&ecirc;m /register : Sẽ c&oacute; 1 form register, bạn c&oacute; thể test thử v&agrave; v&agrave;o database kiểm tra. Vậy&nbsp;Laravel Authentication đ&atilde; l&agrave;m tất cả từ view,controller đến&nbsp;model. Việc ch&uacute;ng ta chỉ đơn giản l&agrave; custom lại view cho ph&ugrave; hợp với dự &aacute;n v&agrave; config lại 1 số function trong RegisterController nếu muốn.</p>\r\n\r\n<p><strong>View:&nbsp;</strong>tất cả view của auth sẽ nằm trong đường dẫn resources/view/auth bạn c&oacute; thể v&agrave;o để kh&aacute;m ph&aacute; hay custom lại theo &yacute; th&iacute;ch.</p>\r\n\r\n<p><strong>RegisterController: </strong>Mặc định sẽ c&oacute; c&aacute;c function validator(), create() để th&ecirc;m user với 3 field name, email v&agrave; password.</p>\r\n\r\n<p>Nhưng t&ocirc;i sẽ thay đổi 1 ch&uacute;t: Th&ecirc;m column active để c&oacute; thể x&aacute;c nhận người d&ugrave;ng (admin hoặc d&ugrave;ng email k&iacute;ch hoạt) v&agrave; th&ecirc;m address lưu địa chỉ user.</p>\r\n\r\n<p>+ Trước ti&ecirc;n thay đổi trong database: bạn c&oacute; thể tự th&ecirc;m thủ c&ocirc;ng bằng mysql nhưng ở đ&acirc;y t&ocirc;i sẻ th&ecirc;m column bằng migrate của laravel&nbsp;</p>\r\n\r\n<p>&nbsp; &nbsp; &nbsp; &nbsp; V&agrave;o database/migration/ ....create_user_table.php</p>\r\n\r\n<pre>\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$table-&gt;boolean(&#39;active&#39;)-&gt;default(0);\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$table-&gt;string(&#39;address&#39;)-&gt;nullable();\r\n&nbsp;        // rồi chạy migrate để th&ecirc;m</pre>\r\n\r\n<p>+ Trong view register th&ecirc;m input address nhớ th&ecirc;m adress trong 2 function validator() v&agrave; create() trong RegisterController. V&agrave; để d&ugrave;ng create với column address cần th&ecirc;m column n&agrave;y v&agrave;o $fillable ở model User , để biết v&igrave; sao lại như vậy bạn c&oacute; thể t&igrave;m hiểu ở&nbsp;<a href=\"/thao-tac-voi-database-qua-eloquent-model-8.html\">Thao t&aacute;c với database qua Eloquent Model</a></p>\r\n\r\n<p>+ T&ocirc;i đ&atilde; th&ecirc;m 1 field active để x&aacute;c nhận user nhưng với mặc định sau khi đăng k&iacute; laravel laravel set login cho user vừa đăng k&iacute; vậy ta cần th&ecirc;m 1 function để giải quyết vấn đề n&agrave;y:</p>\r\n\r\n<pre>\r\npublic function register(Request $request)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;validator($request-&gt;all())-&gt;validate();\r\n&nbsp; &nbsp; &nbsp; &nbsp; $user = $this-&gt;create($request-&gt;all());\r\n&nbsp; &nbsp; &nbsp; &nbsp;// $this-&gt;guard()-&gt;login($user);\r\n&nbsp; &nbsp; &nbsp; &nbsp; return redirect(&#39;/login&#39;);\r\n&nbsp; &nbsp; }\r\n// Sau khi register user dc chuyển hướng về trang login</pre>', 17, 'zS8uOBC0OIlonL6YL5xasdkewlTJNwOFIBE0CuEv.png', 1, 1, 1, '2018-10-12 09:07:42', '2018-10-08 02:47:47', NULL),
  (31, 'Laravel Authentication - Login', 'Laravel Authentication p1', '<h3>LoginController:</h3>\r\n\r\n<p>Với login mặc định cửa Laravel user đăng nhập băng email v&agrave; password, bạn c&oacute; thể th&ecirc;m 1 số function nếu muốn thay đổi cho ph&ugrave; hợp với project của m&igrave;nh:</p>\r\n\r\n<p><strong>1.&nbsp;maxAttempts:&nbsp;</strong>giới hạn số lần đăng nhập thất bại.</p>\r\n\r\n<p>- VD chỉ cần th&ecirc;m $maxAttempts v&agrave;&nbsp;&nbsp;$decayMinutes nếu đăng nhập sai th&ocirc;ng tin qu&aacute; 3 lần sẽ bị block đăng nhập trong 10 ph&uacute;t</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">protected $maxAttempts = 3;<br />\r\nprotected $decayMinutes = 5;</div>\r\n\r\n<p><strong>2. credentials():</strong> để thay đổi những field khi đăng nhập.</p>\r\n\r\n<pre>\r\nprotected function credentials(Request $request)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; return [&#39;name&#39; =&gt; $request-&gt;name, &#39;password&#39; =&gt; $request-&gt;password, &#39;active&#39; =&gt; 1];\r\n&nbsp; &nbsp; }</pre>\r\n\r\n<p>Ở đ&acirc;y m&igrave;nh muốn đăng nhập bằng name v&agrave; user phải được active mới đăng nhập được ( Nếu sử dụng validate th&igrave; c&oacute; thể kh&ocirc;ng cần active = 1).</p>\r\n\r\n<p><strong>3. validateLogin():</strong> validate hoặc&nbsp;custom lại th&ocirc;ng b&aacute;o khi login</p>\r\n\r\n<pre>\r\nprotected function validateLogin(Request $request)\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; $messages = [\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;email.exists&#39; =&gt; &#39;Username hoặc mật khẩu kh&ocirc;ng đ&uacute;ng!&#39;,\r\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//..\r\n&nbsp; &nbsp; &nbsp; &nbsp; ];\r\n&nbsp; &nbsp; &nbsp; &nbsp; $rules = [&#39;email&#39; =&gt; &#39;required|exists:users,email,active,1&#39;, &#39;password&#39; =&gt; &#39;required&#39;];\r\n&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;validate($request, $rules, $messages);\r\n&nbsp; &nbsp; }\r\n// vậy chỉ cần th&ecirc;m active,1 bạn kh&ocirc;ng cần th&ecirc;m active trong credential() ở tr&ecirc;n</pre>\r\n\r\n<p><strong>4. authenticated():</strong> mặc định sau khi login sẽ redirect sang /home theo $redirectTo = &#39;/home&#39; nhưng&nbsp; đ&ocirc;i l&uacute;c muốn redirect t&ugrave;y theo type của user vd như khi login bằng acount admin sẽ v&agrave;o trang /home c&ograve;n nếu login bằng user normal th&igrave; sẽ redirect sang / chẳng hạn.</p>\r\n\r\n<pre>\r\npublic function authenticated()\r\n&nbsp; &nbsp; { &nbsp;&nbsp;\r\n&nbsp; &nbsp; &nbsp; &nbsp; // check user ..\r\n&nbsp; &nbsp; &nbsp; &nbsp; if ($checkAdmin) return redirect(&#39;/home&#39;);&nbsp;\r\n&nbsp; &nbsp; &nbsp; &nbsp; return redirect(&#39;/&#39;);\r\n&nbsp; &nbsp; }\r\n// check user t&ugrave;y thuộc v&agrave;o c&aacute;ch bạn ph&acirc;n quyền user.</pre>', 17, '6GODBwF4dN1iOMuVWxBJfMZ8BTRO2GeFpKcTuPna.png', 0, 1, 1, '2018-11-10 09:08:35', '2018-10-10 01:09:40', NULL),
  (32, 'Laravel Authentication - Fogotpassword', 'Forgot password', '<h3>ForgotPasswordController:</h3>\r\n\r\n<p>Laravel Authenticantion hỗ trợ chức năng forgot password.</p>\r\n\r\n<p>Với&nbsp;route(&#39;password.request&#39;) l&agrave; đường dẫn đến view forgotpassword (auth/password/email.blade.php) custom lại giao diện nếu muốn.</p>\r\n\r\n<p>Khi nhập email Laravel authenticantion sẽ tự động gửi đến email của bạn chứa đường dẫn để reset lại mật khẫu của m&igrave;nh.&nbsp;Giao diện email mặc định th&igrave; chắc chắn kh&ocirc;ng ph&ugrave; hợp với project của bạn n&ecirc;n tạo 1 giao diện mới cho resetpassword&nbsp;mail theo c&aacute;c bước sau:</p>\r\n\r\n<p>+ Chạy lệnh&nbsp;</p>\r\n\r\n<pre>\r\nphp artisan vendor:publish --tag=laravel-notifications</pre>\r\n\r\n<p>Th&agrave;nh c&ocirc;ng sẽ tạo được 1 file email.blade.php trong resources/views/vendor/notifications đ&acirc;y ch&iacute;nh l&agrave; giao diện email resetpassword, việc đơn giản l&agrave; thay thế giao diện n&agrave;y th&ocirc;i, cần ch&uacute; &yacute; đến $actionUrl đ&acirc;y l&agrave; đường dẫn đến trang reset&nbsp;password nếu muốn t&igrave;m hiểu s&acirc;u hơn bạn v&agrave;o đường dẫn sau&nbsp;\\vendor\\laravel\\framework\\src\\Illuminate\\Auth\\Notifications\\Resetpassword.php</p>\r\n\r\n<p>Mặc định thời gian hiệu lực của mail reset password n&agrave;y l&agrave; 60 ph&uacute;t, nếu muốn thay đổi bạn set lại gi&aacute; trị passwords expire ở config/auth.php</p>', 17, 'wGcvVrT1BPWFWShr5dSOuROCS1bMHQaMytDFdvse.png', 1, 1, 1, '2018-11-11 08:56:17', '2018-10-10 09:35:48', NULL),
  (33, 'Laravel Authentication - Reset password', 'Reset Password', '<h3>Reset Password</h3>\r\n\r\n<p>Tương tự như forgot password laravel authentication cũng hỗ trợ tất cả c&aacute;c bước để c&oacute; thể reset password cho ch&uacute;ng ta:</p>\r\n\r\n<p>1. Khi bạn forgot password 1 email sẽ gửi đến cho ch&uacute;ng ta click theo đường dẫn sẽ trở về form để cập nhật mật khẫu mới cho account</p>\r\n\r\n<p>2. Custom lại giao diện nếu muốn tại file /resources/views/auth/passwords/reset.blade.php</p>\r\n\r\n<p>3. Nhập đầy đủ sẽ c&oacute; thể cập nhật password mới</p>\r\n\r\n<p>Nhưng theo project của t&ocirc;i, t&ocirc;i c&oacute; tạo th&ecirc;m field active để k&iacute;ch hoạt account vậy user c&oacute; thể d&ugrave;ng chức năng reset password để c&oacute; thể đăng nhập m&agrave; kh&ocirc;ng cần k&iacute;ch hoạt. Thực sự cũng kh&ocirc;ng cần quan t&acirc;m đến vấn đề n&agrave;y v&igrave; khi user reset password cũng phải th&ocirc;ng qua email vậy tại sao kh&ocirc;ng k&iacute;ch hoạt t&agrave;i khoản bằng email lu&ocirc;n m&agrave; phải rườm r&agrave; như vậy, Nhưng c&oacute; c&ograve;n hơn kh&ocirc;ng, n&ecirc;n tạo 1 chức năng ho&agrave;n hảo nhất c&oacute; thể. Để giải quyết cũng đơn giản ta chỉ cần th&ecirc;m function credentials() v&agrave;o ResetPasswordController với active = 1</p>\r\n\r\n<pre>\r\nprotected function credentials(Request $request)\r\n    {\r\n        return [&#39;token&#39; =&gt; $request-&gt;token, &#39;email&#39; =&gt; $request-&gt;email, &#39;password&#39; =&gt; $request-&gt;password, &#39;password_confirmation&#39; =&gt; $request-&gt;password_confirmation, &#39;active&#39; =&gt; 1];\r\n    }</pre>', 17, 'nlChrtiFY5YOIIcPo1o8wjpjrwy8Bak1rLD7zhFu.png', 0, 1, 1, '2018-11-10 15:51:35', '2018-10-12 04:23:24', NULL),
  (34, 'Đặt tên chuẩn Pr2 trong Laravel', 'Đặt tên chuẩn Pr2 trong Laravel', '<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" class=\"table table-striped\" style=\"width:500px\">\r\n	<tbody>\r\n		<tr>\r\n			<td>Route</td>\r\n			<td>plural</td>\r\n			<td>users/1</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Named route</td>\r\n			<td>snake_case with dot notation</td>\r\n			<td>users.edit</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Controller</td>\r\n			<td>singular</td>\r\n			<td>UserController</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Model</td>\r\n			<td>singular</td>\r\n			<td>User</td>\r\n		</tr>\r\n		<tr>\r\n			<td>hasOne<br />\r\n			belongsTo relationship</td>\r\n			<td>singular</td>\r\n			<td>email</td>\r\n		</tr>\r\n		<tr>\r\n			<td>relationships</td>\r\n			<td>plural</td>\r\n			<td>groups</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Pivot table</td>\r\n			<td>singular&nbsp;model names in alphabetical order</td>\r\n			<td>group_user</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Table</td>\r\n			<td>plura</td>\r\n			<td>users</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Table column</td>\r\n			<td>snake_case without model name</td>\r\n			<td>web_url</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Primary Key</td>\r\n			<td>&nbsp;</td>\r\n			<td>id</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Foreign key</td>\r\n			<td>singular model name with _id suffix</td>\r\n			<td>user_id</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Method</td>\r\n			<td>camelCase</td>\r\n			<td>getAll</td>\r\n		</tr>\r\n		<tr>\r\n			<td>Variable</td>\r\n			<td>camelCase</td>\r\n			<td>&nbsp;</td>\r\n		</tr>\r\n	</tbody>\r\n</table>', 7, '', 1, 1, 1, '2018-10-20 15:37:31', '2018-10-20 03:58:51', NULL),
  (35, 'Graph API Facebook - P1', 'Lấy access token và kiểm tra access token facebook', '<h4>Lấy access token:&nbsp;</h4>\r\n\r\n<p>Muốn lấy access token facbook bạn c&oacute; thể tạo 1 app tại&nbsp;<a href=\"https://developers.facebook.com/\" rel=\"nofollow\" target=\"_blank\">https://developers.facebook.com/</a>&nbsp;rồi v&agrave;o&nbsp;<a href=\"https://developers.facebook.com/tools/explorer/\" rel=\"nofollow\" target=\"_blank\">https://developers.facebook.com/tools/explorer/</a> để lấy token.</p>\r\n\r\n<h4>Kiểm tra access token:</h4>\r\n\r\n<p>Khi sử dụng&nbsp;Graph API Facebook n&ecirc;n kiểm tra trước token đ&oacute; c&oacute; thể sủ dụng được kh&ocirc;ng bằng đoạn code sau:</p>\r\n\r\n<pre>\r\n$token = trim(preg_replace(&#39;/\\s+/&#39;, &#39;&#39;, $token));\r\n$res = getDataByCurlOrFGC(&quot;https://graph.facebook.com/mefields=id&amp;access_token=$token&quot;);\r\n$data = json_decode($res, JSON_UNESCAPED_UNICODE);&nbsp;\r\nif (array_key_exists(&#39;error&#39;, $data)) {\r\n     dd(&#39;Token kh&ocirc;ng sử dụng được&#39;);\r\n} else {\r\n&nbsp; &nbsp; &nbsp;dd(&#39;Token sử dụng được&#39;);\r\n}\r\n\r\nfunction getDataByCurlOrFGC($url)\r\n{\r\n    // is curl installed?\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (function_exists(&#39;curl_init&#39;)){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// create a new curl resource\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$ch = curl_init();&nbsp;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// set URL to download\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curl_setopt($ch, CURLOPT_URL, $url);&nbsp;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// set referer:\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curl_setopt($ch, CURLOPT_REFERER, &quot;http://www.google.com/&quot;);&nbsp;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// user agent:\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curl_setopt($ch, CURLOPT_USERAGENT, sprintf(&quot;Mozilla/%d.0&quot;,rand(1,5)));&nbsp;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// remove header? 0 = yes, 1 = no\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curl_setopt($ch, CURLOPT_HEADER, 0);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// should curl return or print the data? true = return, false = print\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// timeout in seconds\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curl_setopt($ch, CURLOPT_TIMEOUT, 10);&nbsp;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// no ssl\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// download the given URL, and return output\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$output = curl_exec($ch);&nbsp;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// close the curl resource, and free system resources\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curl_close($ch);&nbsp;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// print output\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return $output;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} else {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$output = @file_get_contents($url);&nbsp;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return $output;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;\r\n}</pre>\r\n\r\n<p>//&nbsp;getDataByCurlOrFGC() n&ecirc;n đặt trong 1 class để quản l&iacute;&nbsp;</p>', 19, '', 1, 1, 1, '2018-10-30 02:57:43', '2018-10-30 02:56:04', NULL);
  INSERT INTO `news` (`id_news`, `name`, `preview_text`, `detail_text`, `id_cat`, `picture`, `count_number`, `confirm`, `id`, `updated_at`, `created_at`, `keyword`) VALUES
  (36, 'CMD với MySQL', 'Sử dụng CMD để truy cập và thao tác với MySQL', '<h3><strong>1. Thiết lập:</strong></h3>\r\n\r\n<p>Việc connect MySql với cmd sẽ gi&uacute;p xem dữ liệu&nbsp;hay thao t&aacute;c với database 1 c&aacute;ch nhanh ch&oacute;ng hơn</p>\r\n\r\n<p>Muốn connect đầu ti&ecirc;n bạn cần cd đến thư mục ..\\xampp\\mysql\\bin trong thư mục c&agrave;i xampp của&nbsp;bạn nhưng bạn n&ecirc;n c&agrave;i đặt biến m&ocirc;i trường đễ c&oacute; thể thao t&aacute;c mysql m&agrave; kh&ocirc;ng cần cd đến thư mục tr&ecirc;n.</p>\r\n\r\n<p>C&aacute;c bước c&agrave;i đặt biến m&ocirc;i trường cho MySql:</p>\r\n\r\n<p>+ Bước 1:&nbsp;Control Panel &gt; System and Security &gt; System &gt; Advanced system settings.</p>\r\n\r\n<p>+ Bước 2:&nbsp;Advanced system settings &gt; Environment variables &gt; Path &gt; Edit</p>\r\n\r\n<p>+ Bước 3:&nbsp;Nhấn v&agrave;o n&uacute;t&nbsp;edit&nbsp;v&agrave; điền đường dẫn tới thư mục bin trong MySQL ..\\xampp\\mysql\\bin</p>\r\n\r\n<h3><strong>2. Conect MySQL trong cmd:</strong></h3>\r\n\r\n<p>Bật cmd v&agrave; g&otilde; lệnh sau: mysql -u root -p -h localhost</p>\r\n\r\n<p>root: username, p : password nhưng ở đ&acirc;y m&igrave;nh kh&ocirc;ng d&ugrave;ng n&ecirc;n để trống c&oacute; thể g&otilde; ngắn gọn mysql - u root</p>\r\n\r\n<h3><strong>3. C&aacute;c c&acirc;u lệnh thao t&aacute;c với MySql:</strong></h3>\r\n\r\n<p>+ show database;&nbsp; //&nbsp;&ndash;&nbsp; Hiển thị tất cả database trong MySQL</p>\r\n\r\n<p>+ create database&nbsp;database_name; // - Tạo database lưu &yacute; mặc đinh character set của database tạo l&agrave;&nbsp;latin1 &mdash; cp1252 West European v&agrave; collate l&agrave;&nbsp;latin1_swedish_ci. Muốn sử dụng tiếng việt ta cần th&ecirc;m c&acirc;u lệnh</p>\r\n\r\n<p>create database database_name</p>\r\n\r\n<p>-&gt; character set utf8</p>\r\n\r\n<p>-&gt; collate utf8_unicode_ci;</p>\r\n\r\n<p>với kết th&uacute;c mỗi d&ograve;ng l&agrave; enter v&agrave; d&ograve;ng cuối mới c&oacute; dấu;</p>\r\n\r\n<p>+ Sử dụng database: c&acirc;u lệnh use database_name; kết hợp với những c&acirc;u lệnh sau để thao t&aacute;c trong database được use</p>\r\n\r\n<p>- show tables; //&ndash; Hiển thị tất cả c&aacute;c table trong database được chọn.</p>\r\n\r\n<p>- create table table_name ( col1 int(11), col2 varchar(255))&nbsp;</p>\r\n\r\n<p>- insert into table_name ( col1, col2) values (val1, val2);</p>\r\n\r\n<p>- update table_name set col1 = val1 where condition;</p>\r\n\r\n<p>- delete from table_name where conditon;</p>\r\n\r\n<p>- select * from table_name;</p>\r\n\r\n<p>- desc table_name; // xem cấu tr&uacute;c table</p>\r\n\r\n<p>- drop table table_name; // x&oacute;a table</p>\r\n\r\n<p>- show table from database_name; // - Xem table ở database kh&aacute;c m&agrave; kh&ocirc;ng cần use</p>\r\n\r\n<p>-&gt; Nh&igrave;n v&agrave;o c&oacute; thể đo&aacute;n được t&aacute;c dụng của những c&acirc;u lệnh tr&ecirc;n rồi..</p>\r\n\r\n<p>+ drop database database_name; // X&oacute;a database</p>', 21, 'krpOfRaAh3yGrSJBi8I9yI5YLovpavdbw5diB9Ki.jpeg', 1, 1, 1, '2018-11-05 07:49:24', '2018-11-03 16:40:46', NULL),
  (37, 'View & Blade Templates trong Laravel', 'Mẹo hay dùng trong blade templates laravel', '<p><strong>1. In dữ liệu nếu tồn tại:&nbsp;</strong></p>\r\n\r\n<pre>\r\n{{ $admin&nbsp;or &#39;member&#39; }} thay cho {{ isset($admin) ? $admin : &#39;member&#39;&nbsp;}}</pre>\r\n\r\n<p><strong>2. unless:</strong></p>\r\n\r\n<pre>\r\n@unless (Auth::check())\r\n    Bạn chưa đăng nhập\r\n@endunless</pre>\r\n\r\n<p><strong>3. Kiểm tra mảng rỗng khi foreach:</strong></p>\r\n\r\n<pre>\r\n@forelse ($items as $item)\r\n    {{ $item-&gt;.. }}\r\n@endunless\r\n    No data\r\n@endforelse</pre>\r\n\r\n<p><strong>3. Chia sẻ dự liệu cho nhiều view:</strong></p>\r\n\r\n<p>Nếu&nbsp;nhiều view c&ugrave;ng sử dụng chung dữ liệu vd như danh mục,... ta cần chia sẻ dự liệu cho nhiều view thay v&igrave; mỗi view ta lại lấy dữ liệu đ&oacute; ra.</p>\r\n\r\n<p>C1:&nbsp;View::share( &#39;name&#39; , &#39;value&#39;) để share cho tất cả view</p>\r\n\r\n<p>C2: View composers:</p>\r\n\r\n<p>- Tạo&nbsp;<code>ComposerServiceProvider: php artisan make:provider&nbsp;ComposerServiceProvider</code></p>\r\n\r\n<p><code>- Khai b&aacute;o trong config/app.php:&nbsp;</code></p>\r\n\r\n<pre>\r\n<code>&#39;providers&#39; =&gt; [\r\n    App\\Providers\\ComposerServiceProvider::class,\r\n],</code>\r\n</pre>\r\n\r\n<p>- Tạo 1 folder: app/Http/ViewComposers</p>\r\n\r\n<p>- Vd tạo MenuComposer.php trong ViewComposers</p>\r\n\r\n<pre>\r\n<code>&lt;?php\r\nnamespace App\\Http\\ViewComposers;\r\n\r\nclass MenuComposer\r\n{\r\n&nbsp;&nbsp; &nbsp;protected $catMenu = [];\r\n&nbsp;&nbsp; &nbsp;public function __construct()\r\n&nbsp;&nbsp; &nbsp;{\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$this-&gt;catMenu = [&#39;cat1&#39;, &#39;cat2&#39;];\r\n&nbsp;&nbsp; &nbsp;}\r\n\r\n&nbsp;&nbsp; &nbsp;public function compose(View $view)\r\n&nbsp;&nbsp; &nbsp;{\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$view-&gt;with(&#39;catMenu&#39;, $this-&gt;catMenu);\r\n&nbsp;&nbsp; &nbsp;}\r\n\r\n}</code>\r\n</pre>\r\n\r\n<p>-&nbsp;ComposerServiceProvider function boot():</p>\r\n\r\n<pre>\r\n<code>public function boot()\r\n&nbsp; &nbsp; {\r\n&nbsp; &nbsp; &nbsp; &nbsp; view()-&gt;composer(&#39;*&#39;, &#39;App\\Http\\ViewComposers\\MenuComposer&#39;); // share cho tất cả view\r\n        view()-&gt;composer(&#39;welcome&#39;, &#39;App\\Http\\ViewComposers\\MenuComposer&#39;); // share cho view welcome.blade.php\r\n&nbsp; &nbsp; }</code>\r\n</pre>\r\n\r\n<p>C3: d&ugrave;ng thư viện ngo&agrave;i Widgets:&nbsp;</p>\r\n\r\n<p>- composer require arrilot/laravel-widgets</p>\r\n\r\n<p>- config/app.php</p>\r\n\r\n<pre>\r\n&lt;?php\r\n&#39;providers&#39; =&gt; [\r\n    Arrilot\\Widgets\\ServiceProvider::class,\r\n],\r\n&#39;aliases&#39; =&gt; [\r\n    &#39;Widget&#39;       =&gt; Arrilot\\Widgets\\Facade::class,\r\n    &#39;AsyncWidget&#39;  =&gt; Arrilot\\Widgets\\AsyncFacade::class,\r\n],\r\n</pre>\r\n\r\n<pre>\r\n- php artisan make:widget MenuCat th&agrave;nh c&ocirc;ng sẽ tạo ra 2 file\r\n</pre>\r\n\r\n<p>+&nbsp;app/Widgets/MenuCat:&nbsp;</p>\r\n\r\n<pre>\r\n&lt;?php\r\nnamespace App\\Widgets;\r\n\r\nuse Arrilot\\Widgets\\AbstractWidget;\r\n\r\nclass MenuCat extends AbstractWidget\r\n{\r\n    protected $cats= [];\r\n    public function run()\r\n    {\r\n        return view(&#39;widgets.menu_cat&#39;, [\r\n            &#39;cats&#39; =&gt; $this-&gt;config,\r\n        ]);\r\n    }\r\n}</pre>\r\n\r\n<p>+&nbsp;resources/views/widgets/menu_cat.blade.php</p>\r\n\r\n<pre>\r\n&lt;ul&gt;\r\n&nbsp; @foreach($cats as $cat)\r\n&nbsp; &lt;li&gt;{{$cat}}&lt;/li&gt;\r\n&nbsp; @endforeach\r\n&lt;/ul&gt;\r\n</pre>\r\n\r\n<p>- Trong view nếu muốn nh&uacute;ng view n&agrave;y v&agrave;o:</p>\r\n\r\n<pre>\r\n@widget(&#39;MenuCat&#39;)</pre>\r\n\r\n<p><strong>2. unless:</strong></p>\r\n\r\n<pre>\r\n@unless (Auth::check())\r\n    Bạn chưa đăng nhập\r\n@endunless\r\n</pre>', 22, 'TSDOGmLounwxlwCHRUdSwEwLVC2GCOEYND4SDRbw.png', 1, 1, 1, '2018-11-09 11:14:45', '2018-11-04 15:23:06', NULL),
  (38, 'Xác minh email người dùng - Email Verification laravel', 'Xác thực người dùng Email Verification laravel', '<p>Từ phi&ecirc;n bản 5.7 Laravel c&oacute; th&ecirc;m trong Authenication phần x&aacute;c minh địa chỉ email người d&ugrave;ng:</p>\r\n\r\n<p>- Trong Auth: c&oacute; th&ecirc;m&nbsp;VerificationController</p>\r\n\r\n<p><strong>1. route:</strong></p>\r\n\r\n<pre>\r\n<code>php artisan make:auth</code>\r\n</pre>\r\n\r\n<p>Trong web.php sẽ c&oacute; th&ecirc;m&nbsp;Auth::routes(); cần sửa lại&nbsp;Auth::routes([&#39;verify&#39; =&gt; true]); để bật t&iacute;nh năng&nbsp;email&nbsp;verification</p>\r\n\r\n<p><strong>2. model: </strong>User c&oacute; th&ecirc;m&nbsp;</p>\r\n\r\n<pre>\r\n<code>use Illuminate\\Contracts\\Auth\\MustVerifyEmail;</code></pre>\r\n\r\n<p><span style=\"font-family:monospace\">v&agrave;&nbsp;</span><span style=\"font-family:monospace\">class User extends Authenticatable implements MustVerifyEmail {...} </span></p>\r\n\r\n<p><span style=\"font-family:monospace\">Để khi đăng k&iacute; xong 1 email k&iacute;ch hoạt t&agrave;i khoản sẽ được gửi đến email đăng k&iacute;.&nbsp;</span></p>\r\n\r\n<p><span style=\"font-family:monospace\">K&iacute;ch hoạt th&agrave;nh c&ocirc;ng field&nbsp;email_verified_at trong table users sẽ được update thời gian bạn k&iacute;ch hoạt</span></p>\r\n\r\n<p><strong>3. middleware:</strong></p>\r\n\r\n<p>Khi đăng k&iacute; bạn cũng c&oacute; thể login m&agrave; kh&ocirc;ng cần k&iacute;ch hoạt email vậy ta cần d&ugrave;ng middleware để chặn những user n&agrave;o chưa được k&iacute;ch hoạt.</p>\r\n\r\n<p>- Trong app\\Http\\Kernel.php th&ecirc;m&nbsp;</p>\r\n\r\n<pre>\r\n<code>protected $routeMiddleware = [\r\n    &#39;verified&#39; =&gt; \\Illuminate\\Auth\\Middleware\\EnsureEmailIsVerified::class,\r\n];</code></pre>\r\n\r\n<p>- B&acirc;y giờ những những route n&agrave;o cần người d&ugrave;ng phải verified mới v&agrave;o được bạn chỉ cần middleware(&#39;<code>verified</code>&#39;)</p>\r\n\r\n<pre>\r\n<code>Route::get(&#39;profile&#39;, function () {\r\n    // Only verified users may enter...\r\n})-&gt;middleware(&#39;verified&#39;);</code></pre>\r\n\r\n<p><strong>4. view:</strong></p>\r\n\r\n<p>- Khi người d&ugrave;ng truy cập route tr&ecirc;n sẽ được chuyển đến trang auth/verify.blade.php để gửi mail x&aacute;c minh email.</p>\r\n\r\n<p><strong>5. mail:</strong></p>\r\n\r\n<p>- Laravel sẽ gửi 1 email để x&aacute;c minh, để xem view email n&agrave;y chạy lệnh sau:</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">\r\n<pre>\r\nphp artisan vendor:publish --tag=laravel-notifications&nbsp;</pre>\r\n</div>\r\n\r\n<p>- Giao diện email resources/views/vendor/notifications/email.blade.php</p>\r\n\r\n<p>- C&oacute; thể thay bằng 1 giao diện email ho&agrave;n to&agrave;n mới đẹp v&agrave; ph&ugrave; hợp với dự &aacute;n nhưng khi nhận email bị thay đổi giao diện so với giao diện email mới n&agrave;y. Đ&oacute; l&agrave; do laravel c&oacute; file css của email mặc địch của laravel ảnh hưởng đến giao diện mới th&ecirc;m v&agrave;o, để xem file css n&agrave;y chạy lệnh</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">\r\n<pre>\r\n<code>php artisan vendor:publish --tag=laravel-mail</code></pre>\r\n</div>\r\n\r\n<p>- đường dẫn đến file css:&nbsp;&nbsp;resources/views/vendor/mail/html/themes/default.css h&atilde;y x&oacute;a rỗng file css n&agrave;y th&igrave; giao diện email mới sẽ kh&ocirc;ng bị ảnh hưởng.</p>', 17, 'V5bCEihAqUd1fVBGkWuPUJGnR1UikkPC4n2IS8Gx.png', 0, 1, 1, '2018-11-11 09:04:23', '2018-11-06 13:33:50', NULL),
  (39, 'Accessors & Mutators', 'Format các attributes của Eloquent với Accessors & Mutators', '<p>Accessors v&agrave; Mutators c&oacute; nhiệm vụ l&agrave; cho ph&eacute;p bạn format c&aacute;c attributes của Eloquent.</p>\r\n\r\n<h3>1. Accessors:</h3>\r\n\r\n<p>-&nbsp; format c&aacute;c attributes của Eloquent khi lấy ra từ một model.</p>\r\n\r\n<p>- vd: table users c&oacute; 2 column first_name v&agrave; last_name nhưng ta cần lấy gi&aacute; trị full_name bằng c&aacute;ch nối chuỗi 2 column tr&ecirc;n. Trong model User ta c&oacute; thể set 1 gi&aacute; trị full_name để mỗi&nbsp;khi truy vấn kh&ocirc;ng cần phải set lai gi&aacute; trị full_name</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">\r\n<pre>\r\n<code>class User extends Model\r\n{\r\n    protected $appends = [&#39;full_name&#39;];&nbsp;   </code></pre>\r\n\r\n<pre>\r\n<code>    public function getFullNameAttribute()\r\n    {\r\n        return $this-&gt;attribute[&#39;fist_name &#39;]. &#39; &#39; . $this-&gt;attribute[&#39;last_name&#39;];\r\n    }\r\n}</code></pre>\r\n\r\n<p><code>// controller or view</code></p>\r\n\r\n<p><code>$fullName = User::find(1)-&gt;full_name;</code></p>\r\n</div>\r\n\r\n<p>- C&ograve;n tiện lợi hơn nữa khi ch&uacute;ng ta c&oacute; thể set full_name theo ng&ocirc;n ngữ vd: vi full_name l&agrave; first_name đứng trước, en first_name đứng sau.</p>\r\n\r\n<h3>2. Mutators:</h3>\r\n\r\n<p>- Mutators th&igrave; ngược lại với&nbsp;Accessors :&nbsp; format c&aacute;c attributes của Eloquent trước khi&nbsp;lưu v&agrave;o&nbsp;model.</p>\r\n\r\n<p>- Vd: khi lưu password ta cần Hash trước vậy ta chỉ cần set format password trong model User mỗi lần lưu sẽ kh&ocirc;ng cần Hash nữa.</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">\r\n<pre>\r\n<code>public function setPasswordAttribute($value)\r\n{\r\n   $this-&gt;attributes[&#39;password&#39;] = Hash::make($value);\r\n}</code>\r\n</pre>\r\n\r\n<pre>\r\n<code>$user = App\\User::find(1);\r\n$user-&gt;password = &#39;123456&#39;;</code></pre>\r\n\r\n<p><code>$user-&gt;save();</code></p>\r\n</div>\r\n\r\n<h3>3. Date mutator:</h3>\r\n\r\n<p>-&nbsp;Mặc định, Eloquent sẽ convert <em>created_at </em>v&agrave; <em>update_at </em>th&agrave;nh instances của thư viện Carbon. Bạn cũng c&oacute; thể tạo 1 column timestamp l&agrave; 1&nbsp;instances của thư viện Carbon&nbsp;tương tự.</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">- Vd:&nbsp;<br />\r\nprotected $dates = [&#39;login_at&#39;];<br />\r\n// set: $user-&gt;login_at = Carbon::now();<br />\r\n//get: $user-&gt;login_at-&gt;timestamp;</div>\r\n\r\n<p>&nbsp;- Nếu bạn muốn tuỳ chỉnh format của timestamp, thiết lập v&agrave;o thuộc t&iacute;nh&nbsp;<code>$dateFormat</code></p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\"><code>$dateFormat = &#39;Y-m-d&#39;;</code></div>\r\n\r\n<h3>4. Atributes casting:</h3>\r\n\r\n<p>- Convert <em>Atributes </em>những kiểu dữ liệu kh&aacute;c nhau:&nbsp;</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">- Vd: protected $cast = [&#39;active&#39; =&gt; &#39;boolean&#39;];<br />\r\n- Trong database active c&oacute; kiểu tinyInt(1) sau khi khai b&aacute;o tr&ecirc;n laravel sẽ tự động cast từ boolean sang int khi lưu v&agrave;o database</div>\r\n\r\n<p>C&aacute;c kiểu dữ liệu để cast được hỗ trợ bao gồm: integer, real, float, double, string, boolean, object, array, collection, date, datetime, v&agrave; timestamp&nbsp;</p>', 8, 'emOpbVbg0MvXz53jWp1tQDEzV5twVsZadGqLX2UM.png', 1, 1, 1, '2018-11-16 03:11:17', '2018-11-12 16:06:25', NULL),
  (40, 'Thư viện Carbon trong Laravel.', 'Thư viện Carbon trong Laravel.', '<p>Carbon cung cấp một số h&agrave;m kh&aacute; tốt để xử l&yacute; với date trong PHP:<br />\r\n&nbsp; &nbsp; - Xử l&yacute; với timezone<br />\r\n&nbsp;&nbsp; &nbsp;- Lấy datetime hiện tại dễ d&agrave;ng<br />\r\n&nbsp;&nbsp; &nbsp;- Convert datetime sang 1 số định dạng kh&aacute;c dễ đọc<br />\r\n&nbsp;&nbsp; &nbsp;- Ph&acirc;n t&iacute;ch 1 cụm từ tiếng Anh sang định dạng datetime<br />\r\n&nbsp;&nbsp; &nbsp;- Dễ d&agrave;ng thao t&aacute;c với datetime<br />\r\nDưới đ&acirc;y l&agrave; một số tham khảo chi tiết về thư viện Carbon:</p>\r\n\r\n<pre>\r\n<code>addWeeks(2);\r\n\r\n// Khởi tạo theo date: Thời gian mặc định l&agrave; thời gian hiện tại\r\nCarbon::createFromDate($year, $month, $day, $tz);\r\n\r\n// Khởi tạo theo time: Ng&agrave;y th&aacute;ng năm mặc định l&agrave; ng&agrave;y th&aacute;ng năm hiện tại\r\nCarbon::createFromTime($hour, $minute, $second, $tz);\r\n\r\n// Khởi tạo theo cả date v&agrave; time\r\nCarbon::create($year, $month, $day, $hour, $minute, $second, $tz);\r\n\r\n// Khởi tạo theo datetime v&agrave; format x&aacute;c định\r\nCarbon::createFromFormat($format, $time, $tz);\r\n\r\n// Khởi tạo datetime để l&agrave;m việc với [unix timestamp](https://en.wikipedia.org/wiki/Unix_time)\r\nCarbon::createFromTimestamp($timestamp, $tz)\r\n// Nếu tham số truyền v&agrave;o l&agrave; kh&ocirc;ng ph&ugrave; hợp th&igrave; sẽ throw ra lỗi InvalidArgumentException với message lỗi được định nghĩa trong DateTime::getLastErrors().\r\n\r\n// Thiết lập m&uacute;i giờ\r\n$nowInLondonTz = Carbon::now(&#39;Europe/London&#39;);\r\n$dtVNTz = Carbon::createFromDate(2016, 1, 1, &#39;Asia/Ho_Chi_Minh&#39;);\r\n$dtTokyoTz = Carbon::createFromDate(2016, 1, 1, &#39;Asia/Tokyo&#39;);\r\n\r\n// Tạo 1 đối tượng c&oacute; gi&aacute; trị giống hệt với đối tượng ban đầu:\r\n$dt = Carbon::now();\r\necho $dt-&gt;diffInYears($dt-&gt;copy()-&gt;addYear());  // 1\r\n\r\n// Khởi tạo gi&aacute; trị datetime lớn nhất v&agrave; nhỏ nhất\r\nCarbon::maxValue(); // &#39;2038-01-18 22:14:07&#39;\r\nCarbon::minValue(); // &#39;1901-12-13 15:45:52&#39;\r\n\r\n// Hiển thị theo ng&ocirc;n ngữ:\r\nCarbon::setLocale(&#39;vi&#39;);\r\necho Carbon::now()-&gt;addYear()-&gt;diffForHumans();    // in 1 Jahr\r\n\r\n// Testing\r\n$testDate = Carbon::createfromDate(2016, 03, 26);\r\nCarbon::setTestNow($testDate);  // set the mock\r\necho Carbon::now();             // 2016-03-26 00:00:00\r\necho new Carbon();              // 2016-03-26 00:00:00\r\nvar_dump(Carbon::hasTestNow()); // bool(true)\r\nCarbon::setTestNow();           // clear the mock\r\nvar_dump(Carbon::hasTestNow()); // bool(false)\r\necho Carbon::now();             // today\r\n\r\n// Getet - H&agrave;m lấy th&ocirc;ng số th&ocirc;ng dụng, trả về integer:\r\n$now = Carbon::now();\r\n$now-&gt;year;\r\n$now-&gt;month;\r\n$now-&gt;day;\r\n$now-&gt;hour;\r\n$now-&gt;minute;\r\n$now-&gt;second;\r\n$now-&gt;micro;\r\n$now-&gt;dayOfWeek;\r\n$now-&gt;dayOfYear;\r\n$now-&gt;weekOfMonth;\r\n$now-&gt;weekOfYear;\r\n$now-&gt;daysInMonth;\r\n$now-&gt;timestamp;\r\n\r\n// Setter c&aacute;c h&agrave;m thiết lập tham số \r\n$dt = Carbon::now();\r\n$dt-&gt;year = 1975;\r\n$dt-&gt;month = 13; // year = year + 1, month = month - 12\r\n$dt-&gt;month = 5;\r\n$dt-&gt;day = 21;\r\n$dt-&gt;hour = 22;\r\n$dt-&gt;minute = 32;\r\n$dt-&gt;second = 5;\r\n$dt-&gt;timestamp = 169957925;  // Kh&ocirc;ng thay đổi timezone\r\n// Set timezone th&ocirc;ng qua DateTimeZone hoặc string\r\n$dt-&gt;timezone = new DateTimeZone(&#39;Europe/London&#39;);\r\n$dt-&gt;timezone = &#39;Europe/London&#39;;\r\n$dt-&gt;tz = &#39;Europe/London&#39;;\r\n\r\n// Thiết lập c&oacute; đối số:\r\n$dt = Carbon::now();\r\n$dt-&gt;year(1975)-&gt;month(5)-&gt;day(21)-&gt;hour(22)-&gt;minute(32)-&gt;second(5)-&gt;toDateTimeString();\r\n$dt-&gt;setDate(1975, 5, 21)-&gt;setTime(22, 32, 5)-&gt;toDateTimeString();\r\n$dt-&gt;setDateTime(1975, 5, 21, 22, 32, 5)-&gt;toDateTimeString();\r\n$dt-&gt;timestamp(169957925)-&gt;timezone(&#39;Europe/London&#39;);\r\n$dt-&gt;tz(&#39;America/Toronto&#39;)-&gt;setTimezone(&#39;America/Vancouver&#39;);\r\n\r\n// Isset validate c&aacute;c thuộc t&iacute;nh trong Carbon\r\nvar_dump(isset(Carbon::now()-&gt;iDoNotExist)); // bool(false)\r\nvar_dump(isset(Carbon::now()-&gt;hour));        // bool(true)\r\nvar_dump(empty(Carbon::now()-&gt;iDoNotExist)); // bool(true)\r\nvar_dump(empty(Carbon::now()-&gt;year));        // bool(false)\r\n\r\n// Định dạng chuỗi datetime_\r\n$dt = Carbon::create(1975, 12, 25, 14, 15, 16);\r\nvar_dump($dt-&gt;toDateTimeString() == $dt);// bool(true) =&gt; uses __toString()\r\necho $dt-&gt;toDateString();                // 1975-12-25\r\necho $dt-&gt;toFormattedDateString();       // Dec 25, 1975\r\necho $dt-&gt;toTimeString();                // 14:15:16\r\necho $dt-&gt;toDateTimeString();            // 1975-12-25 14:15:16\r\necho $dt-&gt;toDayDateTimeString();         // Thu, Dec 25, 1975 2:15 PM\r\n\r\n// Một số định dạng phổ biến\r\n$dt = Carbon::now();\r\n// $dt-&gt;toAtomString() is the same as $dt-&gt;format(DateTime::ATOM);\r\necho $dt-&gt;toAtomString();      // 1975-12-25T14:15:16-05:00\r\necho $dt-&gt;toCookieString();    // Thursday, 25-Dec-1975 14:15:16 EST\r\necho $dt-&gt;toIso8601String();   // 1975-12-25T14:15:16-0500\r\necho $dt-&gt;toRfc822String();    // Thu, 25 Dec 75 14:15:16 -0500\r\necho $dt-&gt;toRfc850String();    // Thursday, 25-Dec-75 14:15:16 EST\r\necho $dt-&gt;toRfc1036String();   // Thu, 25 Dec 75 14:15:16 -0500\r\necho $dt-&gt;toRfc1123String();   // Thu, 25 Dec 1975 14:15:16 -0500\r\necho $dt-&gt;toRfc2822String();   // Thu, 25 Dec 1975 14:15:16 -0500\r\necho $dt-&gt;toRfc3339String();   // 1975-12-25T14:15:16-05:00\r\necho $dt-&gt;toRssString();       // Thu, 25 Dec 1975 14:15:16 -0500\r\necho $dt-&gt;toW3cString();       // 1975-12-25T14:15:16-05:00\r\n\r\n// So s&aacute;nh 2 gi&aacute; trị datetime\r\n$first = Carbon::create(2016, 03, 26, 01, 02, 03);\r\n$second = Carbon::create(2016, 03, 26, 20, 02, 03);\r\nvar_dump($first-&gt;eq($second));   // bool(false)\r\nvar_dump($first-&gt;ne($second));   // bool(true)\r\nvar_dump($first-&gt;gt($second));   // bool(false)\r\nvar_dump($first-&gt;gte($second));  // bool(false)\r\nvar_dump($first-&gt;lt($second));   // bool(true)\r\nvar_dump($first-&gt;lte($second));  // bool(true)\r\n\r\n// So s&aacute;nh 1 gi&aacute; trị với 2 gi&aacute; trị datetime kh&aacute;c\r\n$first = Carbon::create(2016, 03, 26, 01);\r\n$second = Carbon::create(2016, 03, 26, 05);\r\nvar_dump(Carbon::create(2016, 03, 26, 03)-&gt;between($first, $second));          // bool(true)\r\nvar_dump(Carbon::create(2016, 03, 26, 05)-&gt;between($first, $second));          // bool(true)\r\nvar_dump(Carbon::create(2016, 03, 26, 05)-&gt;between($first, $second, false));   // bool(false)\r\n// So s&aacute;nh max, min\r\nphp\r\n$dt1 = Carbon::create(2016, 03, 26, 0, 0, 0);\r\n$dt2 = Carbon::create(2016, 03, 30, 0, 0, 0);\r\necho $dt1-&gt;min($dt2);  // 2016-03-26 00:00:00\r\necho $dt1-&gt;max($dt2);  // 2016-03-30 00:00:00\r\necho $dt1-&gt;max();      // now()\r\n\r\n// So s&aacute;nh với now()\r\n$dt = Carbon::now();\r\n$dt-&gt;isWeekday();\r\n$dt-&gt;isWeekend();\r\n$dt-&gt;isYesterday();\r\n$dt-&gt;isToday();\r\n$dt-&gt;isTomorrow();\r\n$dt-&gt;isFuture();\r\n$dt-&gt;isPast();\r\n$dt-&gt;isLeapYear();\r\n$dt-&gt;isSameDay(Carbon::now());\r\n$born = Carbon::createFromDate(1987, 4, 23);\r\n$noCake = Carbon::createFromDate(2014, 9, 26);\r\n$yesCake = Carbon::createFromDate(2014, 4, 23);\r\n$overTheHill = Carbon::now()-&gt;subYears(50);\r\nvar_dump($born-&gt;isBirthday($noCake));   // bool(false)\r\nvar_dump($born-&gt;isBirthday($yesCake));  // bool(true)\r\nvar_dump($overTheHill-&gt;isBirthday());   // bool(true) -&gt; default compare it to today!\r\n\r\n// Cộng trừ với Datetime\r\n$dt = Carbon::create(2012, 1, 31, 0);\r\necho $dt-&gt;toDateTimeStri// 2012-01-31 00:00:00\r\n\r\necho $dt-&gt;addYears(5);  // 2017-01-31 00:00:00\r\necho $dt-&gt;addYear();    // 2018-01-31 00:00:00\r\necho $dt-&gt;subYear();    // 2017-01-31 00:00:00\r\necho $dt-&gt;subYears(5);  // 2012-01-31 00:00:00\r\n\r\necho $dt-&gt;addMonths(60);// 2017-01-31 00:00:00\r\necho $dt-&gt;addMonth();   // 2017-03-03 00:00:00 equivalent of $dt-&gt;month($dt-&gt;month + 1); so it wraps\r\necho $dt-&gt;subMonth();                    // 2017-02-03 00:00:00\r\necho $dt-&gt;subMonths(60);                 // 2012-02-03 00:00:00\r\n\r\necho $dt-&gt;addDays(29);                   // 2012-03-03 00:00:00\r\necho $dt-&gt;addDay();                      // 2012-03-04 00:00:00\r\necho $dt-&gt;subDay();                      // 2012-03-03 00:00:00\r\necho $dt-&gt;subDays(29);                   // 2012-02-03 00:00:00\r\n\r\necho $dt-&gt;addWeekdays(4);                // 2012-02-09 00:00:00\r\necho $dt-&gt;addWeekday();                  // 2012-02-10 00:00:00\r\necho $dt-&gt;subWeekday();                  // 2012-02-09 00:00:00\r\necho $dt-&gt;subWeekdays(4);                // 2012-02-03 00:00:00\r\n\r\necho $dt-&gt;addWeeks(3);                   // 2012-02-24 00:00:00\r\necho $dt-&gt;addWeek();                     // 2012-03-02 00:00:00\r\necho $dt-&gt;subWeek();                     // 2012-02-24 00:00:00\r\necho $dt-&gt;subWeeks(3);                   // 2012-02-03 00:00:00\r\n\r\necho $dt-&gt;addHours(24);                  // 2012-02-04 00:00:00\r\necho $dt-&gt;addHour();                     // 2012-02-04 01:00:00\r\necho $dt-&gt;subHour();                     // 2012-02-04 00:00:00\r\necho $dt-&gt;subHours(24);                  // 2012-02-03 00:00:00\r\n\r\necho $dt-&gt;addMinutes(61);                // 2012-02-03 01:01:00\r\necho $dt-&gt;addMinute();                   // 2012-02-03 01:02:00\r\necho $dt-&gt;subMinute();                   // 2012-02-03 01:01:00\r\necho $dt-&gt;subMinutes(61);                // 2012-02-03 00:00:00\r\n\r\necho $dt-&gt;addSeconds(61);                // 2012-02-03 00:01:01\r\necho $dt-&gt;addSecond();                   // 2012-02-03 00:01:02\r\necho $dt-&gt;subSecond();                   // 2012-02-03 00:01:01\r\necho $dt-&gt;subSeconds(61);                // 2012-02-03 00:00:00\r\n\r\n// T&iacute;nh to&aacute;n sự sai kh&aacute;c giữa 2 gi&aacute; trị datetime\r\ndiffInSeconds()\r\ndiffInMinutes()\r\ndiffInHours()\r\ndiffInDays()\r\ndiffInYears()\r\ndiffInMonths()\r\ndiffInWeeks()\r\ndiffInWeekdays()\r\ndiffInWeekendDays()\r\ndiffInDaysFiltered()\r\ndiffInHoursFiltered()\r\ndiffFiltered()\r\n// V&iacute; dụ:\r\n$current = Carbon::now();\r\n$dt      = Carbon::now();\r\n\r\n$dt = $dt-&gt;subHours(6);\r\necho $dt-&gt;diffInHours($current);         // -6\r\necho $current-&gt;diffInHours($dt);         // 6\r\n\r\n$future = $current-&gt;addMonth();\r\n$past   = $current-&gt;subMonths(2);\r\necho $current-&gt;diffInDays($future);      // 31\r\necho $current-&gt;diffInDays($past);        // -62\r\n\r\n$dt = Carbon::create(2014, 1, 1);\r\n$dt2 = Carbon::create(2014, 12, 31);\r\n$daysForExtraCoding = $dt-&gt;diffInDaysFiltered(function(Carbon $date) {\r\n   return $date-&gt;isWeekend();\r\n}, $dt2);\r\n\r\necho $daysForExtraCoding;      // 104\r\n\r\n$dt = Carbon::create(2014, 1, 1)-&gt;startOfDay();\r\n$dt2 = $dt-&gt;copy()-&gt;endOfDay();\r\n$littleHandRotations = $dt-&gt;diffFiltered(CarbonInterval::minute(), function(Carbon $date) {\r\n   return $date-&gt;minute === 0;\r\n}, $dt2);\r\n\r\necho $littleHandRotations;     // 24\r\n\r\n// Hiển thị thời gian tương đối\r\n$dt     = Carbon::now();\r\n$past   = $dt-&gt;subMonth();\r\n$future = $dt-&gt;addMonth();\r\n\r\necho $dt-&gt;subDays(10)-&gt;diffForHumans();     // 10 days ago\r\necho $dt-&gt;diffForHumans($past);             // 1 month ago\r\necho $dt-&gt;diffForHumans($future);           // 1 month before[/code]\r\n\r\n// Modify\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;startOfDay();                            // 2012-01-31 00:00:00\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;endOfDay();                              // 2012-01-31 23:59:59\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;startOfMonth();                          // 2012-01-01 00:00:00\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;endOfMonth();                            // 2012-01-31 23:59:59\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;startOfYear();                           // 2012-01-01 00:00:00\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;endOfYear();                             // 2012-12-31 23:59:59\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;startOfDecade();                         // 2010-01-01 00:00:00\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;endOfDecade();                           // 2019-12-31 23:59:59\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;startOfCentury();                        // 2000-01-01 00:00:00\r\n\r\n$dt = Carbon::create(2012, 1, 31, 12, 0, 0);\r\necho $dt-&gt;endOfCentury(); \r\n                         // 2099-12-31 23:59:59\r\n\r\n// Hằng số\r\n\r\nvar_dump(Carbon::SUNDAY);                          // int(0)\r\nvar_dump(Carbon::MONDAY);                          // int(1)\r\nvar_dump(Carbon::TUESDAY);                         // int(2)\r\nvar_dump(Carbon::WEDNESDAY);                       // int(3)\r\nvar_dump(Carbon::THURSDAY);                        // int(4)\r\nvar_dump(Carbon::FRIDAY);                          // int(5)\r\nvar_dump(Carbon::SATURDAY);                        // int(6)\r\n\r\nvar_dump(Carbon::YEARS_PER_CENTURY);               // int(100)\r\nvar_dump(Carbon::YEARS_PER_DECADE);                // int(10)\r\nvar_dump(Carbon::MONTHS_PER_YEAR);                 // int(12)\r\nvar_dump(Carbon::WEEKS_PER_YEAR);                  // int(52)\r\nvar_dump(Carbon::DAYS_PER_WEEK);                   // int(7)\r\nvar_dump(Carbon::HOURS_PER_DAY);                   // int(24)\r\nvar_dump(Carbon::MINUTES_PER_HOUR);                // int(60)\r\nvar_dump(Carbon::SECONDS_PER_MINUTE);              // int(60)\r\n\r\n// CarbonInterval\r\n\r\nclass CarbonInterval extends \\DateInterval\r\n{\r\n    // code here\r\n}\r\n?&gt;</code></pre>\r\n\r\n<p>&nbsp;</p>', 7, 'OkX5Uu9yHiIU4oeWQvegeZWbY9jn4fsmYa1KMCns.png', 1, 1, 1, '2018-11-12 16:11:06', '2018-11-12 16:10:54', NULL),
  (41, 'Lưu số điện thoại trong database', 'Lưu số điện thoại trong database', '<p>- Đối với số điện thoại n&oacute; kh&aacute;c so với c&aacute;c field của user cần th&ecirc;m m&atilde; v&ugrave;ng, m&atilde; code quốc gia.</p>\r\n\r\n<p><strong>1. Tạo model:</strong></p>\r\n\r\n<p>- Phone number:</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">\r\n<pre>\r\n<code>Schema::create(&#39;phone_numbers&#39;, function (Blueprint $table) {\r\n            $table-&gt;increments(&#39;id&#39;);\r\n            $table-&gt;integer(&#39;user_id&#39;);\r\n            $table-&gt;string(&#39;region_code&#39;);\r\n            $table-&gt;string(&#39;country_code&#39;);\r\n            $table-&gt;string(&#39;national_number&#39;);\r\n            $table-&gt;string(&#39;e164_format&#39;);\r\n            $table-&gt;timestamps();\r\n        });</code></pre>\r\n\r\n<p><code>// User :</code></p>\r\n\r\n<p><code>public function phoneNumber()<br />\r\n{<br />\r\n&nbsp; &nbsp; return $this-&gt;hasOne(&#39;App\\PhoneNumber&#39;);<br />\r\n}</code></p>\r\n</div>\r\n\r\n<p><strong>&nbsp;2. Thư viện:</strong></p>\r\n\r\n<p><strong>-&nbsp;</strong>Laravel Phone:</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">\r\n<pre>\r\ncomposer require propaganistas/laravel-phone</pre>\r\n\r\n<p>+ config/app.php</p>\r\n\r\n<pre>\r\n&#39;providers&#39; =&gt; [\r\n   ...\r\n   Propaganistas\\LaravelPhone\\PhoneServiceProvider::class,\r\n],</pre>\r\n\r\n<p>+ boostrap/app.php</p>\r\n\r\n<pre>\r\n$app-&gt;register(Propaganistas\\LaravelPhone\\PhoneServiceProvider::class);</pre>\r\n\r\n<p>+ validate:&nbsp;</p>\r\n\r\n<pre>\r\n&#39;phonefield&#39;       =&gt; &#39;phone:US,BE&#39;,</pre>\r\n\r\n<pre>\r\n// &#39;phonefield&#39;    =&gt; Rule::phone()-&gt;country([&#39;US&#39;, &#39;BE&#39;])</pre>\r\n\r\n<pre>\r\n&#39;phonefield_country&#39;    =&gt; &#39;required_with:phonefield&#39;,\r\n</pre>\r\n</div>\r\n\r\n<p><strong>3. View:</strong></p>\r\n\r\n<p>- Sử dụng thư viện <a href=\"https://github.com/jackocnr/intl-tel-input\">intl-tel-input</a> để tạo 1 &ocirc; input nhập số phone:</p>\r\n\r\n<p>- V&agrave;o link tr&ecirc;n để tải về v&agrave; nh&uacute;ng file file css v&agrave; js của intl-tel-input v&agrave;o view.</p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">&lt;input name=&quot;phone_number&quot; value=&quot;{{ old(&#39;phone_number&#39;) }}&quot; type=&quot;text&quot; class=&quot;phone_number form-control&quot; id=&quot;phone&quot; style=&quot;width: 100%;&quot;&gt;<br />\r\n&lt;input type=&quot;hidden&quot; name=&quot;region_code&quot; id=&quot;region_code&quot;&gt;<br />\r\n<br />\r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;{{ asset(&#39;......./intl-tel-input-14.0.0/build/css/intlTelInput.min.css&#39;) }}&quot;&gt;<br />\r\n&lt;script src=&quot;{{ asset(&#39;......./intl-tel-input-14.0.0/build/js/intlTelInput.min.js&#39;) }}&quot;&gt;&lt;/script&gt;<br />\r\nvar input = document.querySelector(&quot;#phone&quot;);<br />\r\n&nbsp; &nbsp; var iti = window.intlTelInput(input, {<br />\r\n&nbsp; &nbsp; &nbsp; // allowDropdown: false,<br />\r\n&nbsp; &nbsp; &nbsp; // autoHideDialCode: false,<br />\r\n&nbsp; &nbsp; &nbsp; // autoPlaceholder: &quot;off&quot;,<br />\r\n&nbsp; &nbsp; &nbsp; // dropdownContainer: document.body,<br />\r\n&nbsp; &nbsp; &nbsp; excludeCountries: [&quot;vn&quot;],<br />\r\n&nbsp; &nbsp; &nbsp; // formatOnDisplay: false,<br />\r\n&nbsp; &nbsp; &nbsp; // geoIpLookup: function(callback) {<br />\r\n&nbsp; &nbsp; &nbsp; // &nbsp; $.get(&quot;http://ipinfo.io&quot;, function() {}, &quot;jsonp&quot;).always(function(resp) {<br />\r\n&nbsp; &nbsp; &nbsp; // &nbsp; &nbsp; var countryCode = (resp &amp;&amp; resp.country) ? resp.country : &quot;&quot;;<br />\r\n&nbsp; &nbsp; &nbsp; // &nbsp; &nbsp; callback(countryCode);<br />\r\n&nbsp; &nbsp; &nbsp; // &nbsp; });<br />\r\n&nbsp; &nbsp; &nbsp; // },<br />\r\n&nbsp; &nbsp; &nbsp; // hiddenInput: &quot;full_number&quot;,<br />\r\n&nbsp; &nbsp; &nbsp; // initialCountry: &quot;auto&quot;,<br />\r\n&nbsp; &nbsp; &nbsp; // localizedCountries: { &#39;de&#39;: &#39;Deutschland&#39; },<br />\r\n&nbsp; &nbsp; &nbsp; // nationalMode: false,<br />\r\n&nbsp; &nbsp; &nbsp; onlyCountries: [ &#39;vn&#39;, &#39;us&#39;, &#39;gb&#39;, &#39;ch&#39;, &#39;ca&#39;],<br />\r\n&nbsp; &nbsp; &nbsp; placeholderNumberType: &quot;MOBILE&quot;,<br />\r\n&nbsp; &nbsp; &nbsp; // preferredCountries: [&#39;cn&#39;, &#39;jp&#39;],<br />\r\n&nbsp; &nbsp; &nbsp; // separateDialCode: true,<br />\r\n&nbsp; &nbsp; &nbsp; utilsScript: &quot;{{ asset(&#39;templates/admin/custom/intl-tel-input-14.0.0/build/js/utils.js&#39;) }}&quot;,<br />\r\n&nbsp; &nbsp; });<br />\r\n&nbsp; &nbsp; var countryData = iti.getSelectedCountryData();<br />\r\n&nbsp; &nbsp; $(&quot;#region_code&quot;).val(countryData.iso2);<br />\r\n&nbsp; &nbsp; $(&quot;#phone&quot;).on(&quot;countrychange&quot;, function(e, countryData) {<br />\r\n&nbsp; &nbsp; &nbsp; var countryData = iti.getSelectedCountryData();<br />\r\n&nbsp; &nbsp; &nbsp; $(this).parents(&#39;.form-group&#39;).find(&#39;#region_code&#39;).val(countryData.iso2);<br />\r\n&nbsp; &nbsp; });</div>\r\n\r\n<p><strong>5. Controller:&nbsp;</strong></p>\r\n\r\n<div style=\"background:#eeeeee; border:1px solid #cccccc; padding:5px 10px\">// create user success<br />\r\n// create phone number for user\r\n<pre>\r\n<code>$user-&gt;phoneNumber()-&gt;create([\r\n  &#39;country_code&#39; =&gt; $phoneNumberObject-&gt;getPhoneNumberInstance()-&gt;getCountryCode(),\r\n  &#39;region_code&#39; =&gt; $phoneNumberObject-&gt;getCountry(),\r\n  &#39;national_number&#39; =&gt; $phoneNumberObject-&gt;getPhoneNumberInstance()-&gt;getNationalNumber(),\r\n  &#39;e164_format&#39; =&gt; $phoneNumberObject-&gt;formatE164()\r\n]);</code></pre>\r\n</div>', 8, '2szrHWn5V59LGXMxvKsWuQX2akN3fwEqtRl1Wu6V.png', 1, 1, 1, '2018-11-14 17:02:30', '2018-11-14 17:02:20', NULL);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `news_tags`
  --
  
  CREATE TABLE `news_tags` (
    `id_news` int(11) NOT NULL,
    `id_tag` int(11) NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `news_tags`
  --
  
  INSERT INTO `news_tags` (`id_news`, `id_tag`) VALUES
  (15, 5),
  (15, 4),
  (16, 7),
  (16, 6),
  (16, 4),
  (17, 4),
  (18, 8),
  (18, 4),
  (19, 8),
  (19, 4),
  (20, 4),
  (21, 4),
  (22, 9),
  (22, 4),
  (24, 9),
  (24, 4),
  (25, 10),
  (26, 10),
  (27, 11),
  (28, 4),
  (29, 11),
  (30, 4),
  (31, 4),
  (32, 4),
  (33, 4),
  (36, 6),
  (38, 4),
  (40, 4);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `password_resets`
  --
  
  CREATE TABLE `password_resets` (
    `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    `token` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    `created_at` timestamp NULL DEFAULT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `password_resets`
  --
  
  INSERT INTO `password_resets` (`email`, `token`, `created_at`) VALUES
  ('admin@gmail.com', '$2y$10$Afq3PdRqr1m8sxc0rdfgSeLxgM6msds.SJyOgOW6NHKtzO.pQF9by', '2018-04-20 12:15:31'),
  ('ninhnghia2@gmail.com', '$2y$10$YtooCO5iE2FEd9k/tvWNL.9bMflXJIOKM7oiMWuuXsnJQZsSpywSW', '2018-05-12 19:36:36');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `projects`
  --
  
  CREATE TABLE `projects` (
    `id_prj` int(11) NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `link` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `picture` text COLLATE utf8_unicode_ci NOT NULL,
    `lang` varchar(2) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'vi',
    `sort` int(4) NOT NULL DEFAULT '500'
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `projects`
  --
  
  INSERT INTO `projects` (`id_prj`, `name`, `link`, `picture`, `lang`, `sort`) VALUES
  (3, 'bnews', 'http://www.bnewsnvn36.tk/', 'DJYghfLdaUsF7ouerdtF2GNHxKvGR3zM5OwLVpWO.png', 'vi', 1),
  (4, 'shareIt - Website chia sẻ kiến thức công nghệ', 'https://www.bnewsnvn36.tk', 'GovEuBEMJBhA9t6ySv6mAmzi6Ov7TL7P6jphEeq9.png|G4wBwZQRflfKP16TAmfZwzPp6BiL3YOcrLXobuvd.png|UMXL9PQYY45d3DwbHmp2KZfCPzuSRbAfjYzmLClC.png|', 'vi', 2),
  (5, 'Lasenshop - website mua bán trực tuyến', 'https://hmshopnvn.000webhostapp.com', '8RVXxBe4vCVrbeKnAXHBkXE0VG1u0hBC5ASk3dSL.png|N8HH3rsM6dgRdAu63Mg6rb9kKBmsiz7oTUiwcOIm.png|Dxc858dTqHU4OW0gxEVMLVl3JjjYaBHYFVWwVPKR.png|SXXvZexyO4Wlwd6R0OjsLPi9UUIatuLo4G8DrS2I.png|vrexUdutDm3Vim9VzVB6xy99egozm6KM0jCO0axE.png|fW791fuL2f4FHto9uTTUvKQWmxFWxeAYHYrPf2F0.png|qG6n5IxpN4pCxXmCUX7q0VCL1ggbHYTqLjexuIdl.png|W35ufBn3Avj0CiF7ynbHjt3I7yVZlbEiyZ3QyTPZ.png|', 'vi', 3),
  (7, 'balo.tv - Website giải trí và chia sẻ video youtube, vimeo.', 'http://balo.tv/', 'JVFbH1H2LL7uZdhTDKlqLDyciDQ1JKjGbssiExSt.png|G8eBh7kzRZkKrS9ugcYgF9r4RuB5VBoHkE5KktTp.png|AyF0nVTytYheuq77FVTX9DlGiyuHPrUfuVbnTpod.png|qew83U7SmHhlBIpDPct2lrcyJZJjcaYocCI4vgd5.png|', 'vi', 7),
  (8, 'Top Nail Supply - Nail products shop', 'http://topnailsupply.com/', 'fxFjidw98xqCgGzlUPf7R0QGRNZaznH93ETLbxxA.png|gh3VXIY00h9eJUvS28AZUU6dklTe4SbmBxbrh3Yd.png|ydMBl87lPltYkcxlPynvq3vDxC65WA81UN6PEaBs.png|HaSvkxNxmyu8ow5Zqa5XmO9boHrjcCyrfWbE2iXF.png|', 'vi', 5),
  (9, 'Naillua Plano - Website giới thiệu dịch vụ.', 'http://nailluaplano.vinaenter.net/', '9tJXpsIp64J7MELH1XrwZW9b58Jx1FS817wfaSpz.png|oODKiPdkYq5jLJ3Xqk2o0WYiPk1mPVsoyVroTwdM.png|LfzN30U6WnCSymbUZI6f383U2fZkm059igQ4agu9.png|', 'vi', 4),
  (10, 'Naillua Plano - Introduction service Website', 'http://nailluaplano.vinaenter.net/', 'HeCrJNzFtNRQxdzSTCUTFFEmAr0Etu6cWFye0Gua.png|RWXMIGAx4YQ3K2VkYR67J1VQULKXfgUGd8WiodjC.png|mYFnGTnKUGWZu4qvCF9lqxGPqFVdrAITlzJlxRWK.png|', 'en', 4),
  (11, 'Top Nail Supply - Nail products shop', 'http://topnailsupply.com/', 'mJdnqP8L0xCCdc4x0ptX76L1McXy9f76uP8xxUZn.png|FQfGxmWLgO2g7NQmd6ssbOeOvR6socZbOy7Qs75W.png|mciCM41hX5KdYIdyNTSqCS42NMhsczsvphTya1jN.png|7rmGhuVU6ezV3vRQD2PFkQvm8QmLy8CzhJaCK35X.png|', 'en', 5),
  (12, 'balo.tv - Entertainment and youtube or vimeo video sharing  website', 'http://balo.tv/', 'CeRIoXzYCaf1lArggHCwsBbkUm0tWsTyvlMSYYIp.png|3rGpDbOeiX45zLcYqLFLpmxCViPjNTabJ8hw2csm.png|BcEFvTf4Enm1af66Sv4IfnbUlmL6XZ0tQ8rHdDa6.png|7beCd6zWl8e8aW1hsv4i9LqsgSxV1R8M89BozoyD.png|', 'en', 7),
  (13, 'Lasenshop - Online shopping website', 'https://hmshopnvn.000webhostapp.com', 'cCIsBN8TOpVbesUumb7P3qTXGQXgI9kP70R2k4R7.png|BA65vDqd7rILuug0ZBiesks9Ak9X1lxyWd7MjuCj.png|NYvZ4kpoOPnXxWK7wzDd7Ez3foJV3hRiBOMVU2mH.png|T6TzXVMYeYOymUaxjXJpgTGA70f5PBJEt3Wyh8VQ.png|zbSp2TMmi3A4tsRNXLA8fvCgyT4SoNa0qoD52n9G.png|N2oSShk4UFmCYhAWvaQplDDcgEOcanw43CvuWjLh.png|QWk85LVR5ZyeRfBZft8Ke5qJB2zJqRW4FlohH1jq.png|96n6zHgJBw4M5y025kC6gX0sFAHiM05nmEOMHGyA.png|', 'en', 3),
  (14, 'shareIt - Technology knowledge sharing website', 'https://www.bnewsnvn36.tk', 'iUB5yasSJketIlmT36bqeOB0ugb3J00PLOuD00PI.png|OYtBPHbvmiobIj4BG2kJ8CYQ8uhsebi8P3OJfcj4.png|p9kOuW0StGfOCRp8a0hrAwDOqdcb8DBt3U7K5LZU.png|', 'en', 2),
  (15, 'bnews', 'http://www.bnewsnvn36.tk/', 'Jiy8h8bdDTHiPCY6jljJiX5x6zDuFYRLjmjcm5EW.png|', 'en', 1),
  (16, 'BaloFun - Mạng xã hội tài chính', 'https://balofun.com/', '7bGbeqnBUONI3pPlZlcI3UAaEXjSRKnylFVbmmvp.png|Zzt6OT7b7LpXyIxL5ckG87vefWtVhf3T7uugzHz5.png|8lBNdMTSl3Ls35rHjN48Ec6258DI2e6GC4un9Dvu.png|AfGU6vlkPzS2aBbIeKMe5JqbQpKHOqav9xD8Fy0Y.png|m9ydG2h8mydpXIwJ6ev2fdHS6wLZgwOxe23oEx2R.png|', 'vi', 8),
  (17, 'BaloFun', 'https://balofun.com/', 'DSkRRl53qgtKvDQu2FM3rPnpRupsLVQOLyZOnLs4.png|jjMmIAP7uF5MmYb8rf09jO7meW5pYdUSV5RzWNTY.png|GhBJrT3nvpV1gyhEMqjLfrsCAXFYUNmG9l67BVcy.png|6u8KZR6RyZlsUeL90X1ZTpBtSI6JeiuDkaubpilu.png|VhfdBRk0QQVnZ4h4l99IHGulKW6oag7e46Q9fVvI.png|', 'en', 8);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `quotations`
  --
  
  CREATE TABLE `quotations` (
    `id_quo` int(11) NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `job` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `picture` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `content` text COLLATE utf8_unicode_ci NOT NULL,
    `language_code` varchar(11) COLLATE utf8_unicode_ci DEFAULT 'en'
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `quotations`
  --
  
  INSERT INTO `quotations` (`id_quo`, `name`, `job`, `picture`, `content`, `language_code`) VALUES
  (8, 'Bill Gates', 'Microsoft', 'p9emXVCfDUQPGDnZusIyDqc8ikP1TVqWnL12MMs4.jpeg', 'As we look ahead into the next century, leaders will be those who empower others.', 'en'),
  (9, 'Steve Jobs', 'Apple inc', 'VvMueWIsx04Nxtlj0p1Vz4f2IOgG1nIM79HzV9S3.jpeg', 'You can\'t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something - your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.', 'en'),
  (10, 'Albert Einstein', 'scientist', '02qygDPeqqpb8LsykmbGB1rtK3cMxLVGYh2pkp5G.jpeg', 'Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world.', 'en'),
  (11, 'Bill Gates', 'Microsoft', 'p9emXVCfDUQPGDnZusIyDqc8ikP1TVqWnL12MMs4.jpeg', 'Nếu bạn sinh ra trong nghèo khó, đó không phải là lỗi của bạn. Nhưng nếu bạn chết trong nghèo khó, thì đó là lỗi của bạn.', 'vi'),
  (12, 'Steve Jobs', 'Apple inc', 'VvMueWIsx04Nxtlj0p1Vz4f2IOgG1nIM79HzV9S3.jpeg', 'Niềm tin rằng những gì ở hiện tại bằng cách nào đó sẽ kết nối trong tương lai nếu bạn dám theo đuổi đam mê', 'vi'),
  (13, 'Albert Einstein', 'scientist', '02qygDPeqqpb8LsykmbGB1rtK3cMxLVGYh2pkp5G.jpeg', 'Dấu hiệu thực sự của sự thông minh không phải là kiến thức mà là trí tưởng tượng', 'vi');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `skills`
  --
  
  CREATE TABLE `skills` (
    `id_skill` int(11) NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `value` int(11) NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `skills`
  --
  
  INSERT INTO `skills` (`id_skill`, `name`, `value`) VALUES
  (1, 'HTML', 85),
  (2, 'CSS', 90),
  (3, 'JAVASCRIPT', 85),
  (4, 'PHP', 95),
  (5, 'LARAVEL', 90);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `tags`
  --
  
  CREATE TABLE `tags` (
    `id_tag` int(11) NOT NULL,
    `tag` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `tags`
  --
  
  INSERT INTO `tags` (`id_tag`, `tag`, `name`) VALUES
  (1, 'php', 'PHP'),
  (3, 'html', 'HTML'),
  (4, 'laravel', 'Laravel'),
  (5, 'cookie', 'Cookie'),
  (6, 'co-so-du-lieu', 'Cơ sở dữ liệu'),
  (7, 'collection', 'Collection'),
  (8, 'route', 'Route'),
  (9, 'validation', 'Validation'),
  (10, 'vuejs', 'vuejs'),
  (11, 'javascript', 'JAVASCRIPT'),
  (12, 'model', 'model');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `users`
  --
  
  CREATE TABLE `users` (
    `id` int(10) UNSIGNED NOT NULL,
    `username` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    `fullname` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
    `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    `active` tinyint(4) NOT NULL,
    `created_at` timestamp NULL DEFAULT NULL,
    `updated_at` timestamp NULL DEFAULT NULL,
    `avatar` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    `slogan` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `users`
  --
  
  INSERT INTO `users` (`id`, `username`, `email`, `fullname`, `password`, `remember_token`, `active`, `created_at`, `updated_at`, `avatar`, `slogan`) VALUES
  (1, 'admin', 'admin@gmail.com', 'NinhNghiaIt', '$2y$10$Jrz6CpNC8Ed29bVpj.UkHOgVYvg5eNDKJ/ru6tZftnnJaTri4B6xO', '4zBaJYm63ADLAsGK5vQs15WJTUox7mrzOZreWIIEKLERN6TguUwopldNxoHH', 1, '2018-04-20 06:07:40', '2018-09-03 00:43:03', NULL, 'sdsdsd'),
  (3, 'admindemo', 'admindemo@gmail.com', 'admindemo', '$2y$10$u.ogZAsmcYak/ROVGQ/3PeSEdUEErb1mXSBIBW926htxwTuWuggB6', NULL, 0, '2018-04-20 06:28:46', '2018-04-20 06:28:46', NULL, '');
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `users_groups`
  --
  
  CREATE TABLE `users_groups` (
    `uId` int(11) NOT NULL,
    `gId` int(11) NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `users_groups`
  --
  
  INSERT INTO `users_groups` (`uId`, `gId`) VALUES
  (3, 10),
  (1, 8),
  (1, 10);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `user_activations`
  --
  
  CREATE TABLE `user_activations` (
    `user_id` int(10) UNSIGNED NOT NULL,
    `token` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    `created_at` timestamp NULL DEFAULT NULL,
    `updated_at` timestamp NULL DEFAULT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  
  --
  -- Đang đổ dữ liệu cho bảng `user_activations`
  --
  
  INSERT INTO `user_activations` (`user_id`, `token`, `created_at`, `updated_at`) VALUES
  (8, '52bda2913c2767e93992dbf9f8ac8aad633fd60592204d963563b9d3f8b0ba1f', NULL, NULL),
  (10, '7b59a02c42ccc5a83f7ae35889a97638c36fb5a9ff98ab96a32953f5e90cdd31', NULL, NULL),
  (12, '2f4353d06ef725dece8f00c9fa587efda25d0312a1852c82e146f58d2914e82e', NULL, NULL),
  (13, '1c71948ae0f173b03509a97b134ae964cfd49c9d69819d678cdc579468cddff0', NULL, NULL),
  (14, 'c4751490c246edd8870fc2730fa0258e9b5abf2f8cb1709225b01fa615fb1ab4', NULL, NULL),
  (15, '50904e843d88a6f213d3c282ac33b2541de785a596a77bd945301bfe5ebf0c95', NULL, NULL),
  (16, '4f53ec3efb25cb443ef3e880d1f21a4415900fd7678487e636afe949a6636bc9', NULL, NULL);
  
  -- --------------------------------------------------------
  
  --
  -- Cấu trúc bảng cho bảng `video`
  --
  
  CREATE TABLE `video` (
    `video_id` int(11) NOT NULL,
    `code` varchar(100) COLLATE utf8_unicode_ci NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  --
  -- Chỉ mục cho các bảng đã đổ
  --
  
  --
  -- Chỉ mục cho bảng `category`
  --
  ALTER TABLE `category`
    ADD PRIMARY KEY (`id_cat`);
  
  --
  -- Chỉ mục cho bảng `comment`
  --
  ALTER TABLE `comment`
    ADD PRIMARY KEY (`id_cmt`);
  
  --
  -- Chỉ mục cho bảng `contact`
  --
  ALTER TABLE `contact`
    ADD PRIMARY KEY (`id_ct`);
  
  --
  -- Chỉ mục cho bảng `cv`
  --
  ALTER TABLE `cv`
    ADD PRIMARY KEY (`id`);
  
  --
  -- Chỉ mục cho bảng `experiences`
  --
  ALTER TABLE `experiences`
    ADD PRIMARY KEY (`id_exp`);
  
  --
  -- Chỉ mục cho bảng `gallery`
  --
  ALTER TABLE `gallery`
    ADD PRIMARY KEY (`gallery_id`);
  
  --
  -- Chỉ mục cho bảng `groups`
  --
  ALTER TABLE `groups`
    ADD PRIMARY KEY (`id_group`);
  
  --
  -- Chỉ mục cho bảng `images`
  --
  ALTER TABLE `images`
    ADD PRIMARY KEY (`img_id`);
  
  --
  -- Chỉ mục cho bảng `migrations`
  --
  ALTER TABLE `migrations`
    ADD PRIMARY KEY (`id`);
  
  --
  -- Chỉ mục cho bảng `myinfo`
  --
  ALTER TABLE `myinfo`
    ADD PRIMARY KEY (`id_if`);
  
  --
  -- Chỉ mục cho bảng `news`
  --
  ALTER TABLE `news`
    ADD PRIMARY KEY (`id_news`);
  
  --
  -- Chỉ mục cho bảng `password_resets`
  --
  ALTER TABLE `password_resets`
    ADD KEY `password_resets_email_index` (`email`);
  
  --
  -- Chỉ mục cho bảng `projects`
  --
  ALTER TABLE `projects`
    ADD PRIMARY KEY (`id_prj`);
  
  --
  -- Chỉ mục cho bảng `quotations`
  --
  ALTER TABLE `quotations`
    ADD PRIMARY KEY (`id_quo`);
  
  --
  -- Chỉ mục cho bảng `skills`
  --
  ALTER TABLE `skills`
    ADD PRIMARY KEY (`id_skill`);
  
  --
  -- Chỉ mục cho bảng `tags`
  --
  ALTER TABLE `tags`
    ADD PRIMARY KEY (`id_tag`);
  
  --
  -- Chỉ mục cho bảng `users`
  --
  ALTER TABLE `users`
    ADD PRIMARY KEY (`id`),
    ADD UNIQUE KEY `users_email_unique` (`email`);
  
  --
  -- Chỉ mục cho bảng `user_activations`
  --
  ALTER TABLE `user_activations`
    ADD KEY `user_activations_activation_code_index` (`token`);
  
  --
  -- Chỉ mục cho bảng `video`
  --
  ALTER TABLE `video`
    ADD PRIMARY KEY (`video_id`);
  
  --
  -- AUTO_INCREMENT cho các bảng đã đổ
  --
  
  --
  -- AUTO_INCREMENT cho bảng `category`
  --
  ALTER TABLE `category`
    MODIFY `id_cat` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=23;
  
  --
  -- AUTO_INCREMENT cho bảng `comment`
  --
  ALTER TABLE `comment`
    MODIFY `id_cmt` int(11) NOT NULL AUTO_INCREMENT;
  
  --
  -- AUTO_INCREMENT cho bảng `contact`
  --
  ALTER TABLE `contact`
    MODIFY `id_ct` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
  
  --
  -- AUTO_INCREMENT cho bảng `cv`
  --
  ALTER TABLE `cv`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
  
  --
  -- AUTO_INCREMENT cho bảng `experiences`
  --
  ALTER TABLE `experiences`
    MODIFY `id_exp` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;
  
  --
  -- AUTO_INCREMENT cho bảng `gallery`
  --
  ALTER TABLE `gallery`
    MODIFY `gallery_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
  
  --
  -- AUTO_INCREMENT cho bảng `groups`
  --
  ALTER TABLE `groups`
    MODIFY `id_group` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
  
  --
  -- AUTO_INCREMENT cho bảng `images`
  --
  ALTER TABLE `images`
    MODIFY `img_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
  
  --
  -- AUTO_INCREMENT cho bảng `migrations`
  --
  ALTER TABLE `migrations`
    MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
  
  --
  -- AUTO_INCREMENT cho bảng `myinfo`
  --
  ALTER TABLE `myinfo`
    MODIFY `id_if` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
  
  --
  -- AUTO_INCREMENT cho bảng `news`
  --
  ALTER TABLE `news`
    MODIFY `id_news` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=42;
  
  --
  -- AUTO_INCREMENT cho bảng `projects`
  --
  ALTER TABLE `projects`
    MODIFY `id_prj` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=18;
  
  --
  -- AUTO_INCREMENT cho bảng `quotations`
  --
  ALTER TABLE `quotations`
    MODIFY `id_quo` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=14;
  
  --
  -- AUTO_INCREMENT cho bảng `skills`
  --
  ALTER TABLE `skills`
    MODIFY `id_skill` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
  
  --
  -- AUTO_INCREMENT cho bảng `tags`
  --
  ALTER TABLE `tags`
    MODIFY `id_tag` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
  
  --
  -- AUTO_INCREMENT cho bảng `users`
  --
  ALTER TABLE `users`
    MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
  
  --
  -- AUTO_INCREMENT cho bảng `video`
  --
  ALTER TABLE `video`
    MODIFY `video_id` int(11) NOT NULL AUTO_INCREMENT;
  COMMIT;
  
  /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  