New Features in Laravel 5.3 (P1)
Bài đăng này đã không được cập nhật trong 3 năm
Lời mở đầu
Laravel mới release phiên bản 5.3 , chắc nhiều anh em đã review qua và thấy nhiều cái mới và hay ho. Bài viết ngày hôm nay mình sẽ giới thiệu về 2 feature mới của laravel 5.3. Đó là :
- The new $loop variable in Laravel 5.3
- Customizing additional parameters in FirstOrCreate in Laravel 5.3
- The new cache() global helper in Laravel 5.3
- New JSON-column where() and update() syntax in Laravel 5.3
Nào, giờ thì LET GO :
I : Giới thiệu về biến $loop
trong laravel 5.3
1, Blade directives
là gì?
-
Blade directives
là 1 template dùng để render ra view bao gồm 1 chuối HTML và logic của view và logic này thường được biểu hiện ra bẳng cáidirectives
việt hóa ra thì là các chỉ thị được bắt đầu bằng ký tự@
-
Chắc hẳn vs anh em dev chúng ta ko xa lạ gì vs các
directives
này, điển hình như : @if, @foreach .... -
Và thật ra thì các
directives
này chỉ là cách viết đơn giản mô phỏng cách viết nguyên thủy củaphp
như :@if ($a == $b) sẽ được render ra cụm php <? php if ($a == $b) {} ?>
2, Giới thiệu về biến $loop
trong laravel 5.3
-
Trong version 5.3 này,
directives
@foreach nhận thêm được sức mạnh từ 1 biến$loop
được cung cấp sẵn bên trongdirectives
@foreach -
Biến
$loop
là một đối tượngstdClass
cung cấp thông tin về vòng lặp bạn hiện đang ở bên trong. Nào bây giờ cùng ngồi nghiên cứu một chút các thuộc tính mà nó cung cấp nào :index
: integer - chỉ vị trí hiện tại của item bên trong mảng dữ liệu với item đầu tiên sẽ ra kết quả là 0iteration
: integer - chỉ vị trí hiện tại của item bên trong mảng dữ liệu với item đầu tiên sẽ ra kết quả là 1remaining
: integer - chỉ số item còn lại bên trong mảng dữ liệu nếu mảng dữ liệu có 3 phần tử, item hiện tại là phần tử đầu tiên thì sẽ ra kết quả là 2count
: integer - Tất nhiên thuộc tính này là đếm số item có trong mảng dữ liệufirst
: boolean - Trả về giá trị true khi item đang xét là phần tử đầu tiên của mảng dữ liệulast
: boolean- Trả về giá trị true khi item đang xét là phần tử cuối cùng của mảng dữ liệudepth
: integer - chỉ về độ sâu của item đang xét (bắt đầu tính từ 1). Nếu mảng dữ liệu của bạn là 1 mảng dữ liệu phức tạp với nhiều mảng con thì thuộc tính này sẽ khá hữu ích, bên dưới mình sẽ nêu ví dụ cụ thể để các bạn rõ ràng hơn.parent
: stdClass - nếu vong lặp đang xét nằm trong một vòng lặp khác thì sẽ trả vể biến$loop
của mảng cha.
OK, chúng ta đã tìm hiểu xong phần này rồi, giờ demo để các bạn hiểu về 2 cái thuộc tính depth
, parent
nhé (vì mấy cái bên trên cũng đơn giản dễ hiểu rồi). Giờ mình có 1 mảng dữ liệu như sau :
$data = [
'php_fr' => [
'laravel' => ['laravel_ver3', 'laravel_ver4', 'laravel_ver5'],
'cake' => ['cake_ver2', 'cake_ver3', 'cake_ver4']
],
'javascript_fr' => [
'node' => ['v2', 'v4']
]
];
và mình có 1 file blade để viết các directives
mình có đoạn code sau :
@foreach ($data as $input)
{{ $loop->depth }} // kết quả : 1
@foreach ($input as $input_child)
{{ $loop->depth }} // kết quả : 2
{{ var_dump($loop->parent) }} // kết quả : biến $loop của vòng lặp 1
@foreach ($input_child as $input_child_2)
{{ $loop->depth }} // kết quả : 3
@endforeach
@endforeach
@endforeach
II : Chỉnh sửa tham số đầu vào của hàm firstOrCreate
của Eloquent
- Với hàm static
firstOrCreate
này thì tên nó đã nói lên tất cả chức năng của nó rồi, tìm kiếm kết quả đầu tiên hoặc tạo mới . Với laravel 5.3 nó đã cả thiện hàm này một cách rất hay ho ... Mình sẽ làm một phép ví dụ đơn giản để bạn hiểu được sự cải thiện của nó.
Giờ mình có 1 câu truy vấn mẫu sau:
$user = User::firstOrCreate(['name' => 'abc']);
Với câu truy vấn bên trên chúng ta sẽ tìm user đầu tiền với name là abc. Ok, ổn đấy .... thế nhưng nếu mình muốn 1 bản ghi có name là abc và email là xyz@gmail.com thì sao .... Không vấn đề gì vấn đơn giản :
$user = User::firstOrCreate(['name' => 'abc', 'email' => 'xyz@gmail.com']);
Nào thử tưởng tưởng cách khác xem, mình muốn tạo 1 user có name là abc và email là xyz@gmail.com ... tuy nhiên nều đã tồn tại 1 bản ghi có name là abc thì gọi thẳng bản ghi đó ra =)) ... quả này xử thế nào, với các version cũ hơn thì chúng ta cần viết 2 đoạn mã code để check xem có tồn tại hay không để xem tạo hay lấy ... Còn với version 5.3 mới này, laravel đã custom lại hàm firstOrCreate
để xử lý cho trường hợp này, chúng ta có thể dùng hàm sau :
$user = User::firstOrCreate(['name' => 'abc'], ['email' => 'xyz@gmail.com']);
Đơn giản đúng không ... chỉ một thay đổi nho nhỏ mà giải quyết được bao nhiêu việc =)) ... Như vậy cú pháp mới của hàm này là :
Eloquent::firstOrCreate([condition], [data_create]);
III, The new cache() global helper in Laravel 5.3
Nếu các bạn đã sử dụng nhiều về session trong các version trước, các bạn có thể nhận thấy rằng là session trong helper của nó rất tiện dụng với ba chức năng chính : lấy một giá trị, đặt một giá trị, hoặc trả lại một instance của service quản lý session. Cụ thể như sau :
- session('name', null) : lấy về giá trị của session name , nếu không có trả về giá trị null
- session(['name' => 'Việt Anh']) : set giá trị session name là Việt Anh
- session() : trả về 1 instance của SessionManager.
Cũng tương tự như vậy, trong version 5.3 đã phát triển cache() helper có chức năng tương tự như session. Cụ thể như sau :
- cache('name', null) : lấy về giá trị của cache name , nếu không có trả về giá trị null
- cache(['name' => 'Việt Anh'], 5) : set giá trị cache name là Việt Anh và life time là 5 phút
- cache() : trả về 1 instance của CacheManager.
- cache()->forever('name', 'Viet Anh') : set giá trị cache name là Việt Anh và life time là mãi mãi (thực tế là khoảng 5 năm, mình cũng không nhớ rõ lắm)
IV, Thêm mới, cập nhật và truy vấn với dữ liệu dạng json
- Kể từ khi laravel version 5.0 dữ liệu của bạn có thể chuyển đổi qua lại dạng JSON.Tuy nhiên, trên thực tế thì dữ liệu của bạn vẫn ở dạng dữ liệu nguyên thủy trong 1 bản ghi của database ... Nhưng trong version 5.7, Mysql đã giới thiệu một dạng dữ liệu mới đó là JSON.
- Chính vì thế trong version 5.3 này, laravel đã giới thiệu phương pháp làm việc vơi dạng dữ liệu mới này ... Cụ thể như sau:
Đầu tiên chúng ta cần tạo ra 1 table có dạng dự liệu là json (hãy đảm bảo rằng Mysql của bạn ít nhất phải là 5.7 nhé =)) )
class CreateContactsTable extends Migration
{
public function up()
{
Schema::create('contacts', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->json('meta');
$table->timestamps();
});
}
Chúng ta tưởng tượng rằng thông tin meta sẽ có mẫu như sau :
{
"wants_newsletter": true,
"favorite_color": "red"
}
Vì vậy, nếu bạn muốn tìm kiếm contact mà có favorite_color
là red thì chỉ cần truy vấn như sau :
$redLovers = DB::table('users')
->where('meta->favorite_color', 'red')
->get();
Nhìn cú pháp trên chắc các bạn cũng đã hiểu cách truy vấn rồi chứ, dùng ký tự ->
để trỏ đển thuộc tính cần truy vấn ... CŨng tương tự như vậy, để cập nhật json thì ta cũng chỉ cần thực hiệu cấu truy vấn như sau :
DB::table('users')
->where('id', 1)
->update(['meta->wants_newsletter' => false]);
Như vậy đó, thật đơn giản phải không ... Tuy nhiên, có 1 chút lưu ý cho các bạn nếu dùng feature này đó là hiện nay MariaDB thì không có cột JSON, and PostgreSQL thì có cột JSON nhưng feature này thì hiện tại không làm việc trên PostgreSQL nên các bạn khi sử dụng nên chú ý 1 chút .
OK, đến đây mình xin kết thúc bài tìm hiểu tại đây ... Mình sẽ tiếp tục chủ đề này trong bài viết sắp tới vì vẫn còn nhiều cái hay ho để viết lắm =))
V : TÀI LIỆU THAM KHẢO
All rights reserved