Laravel và NoSql
Hôm nay mình sẽ chia sẻ cho các bạn làm thế nào để sử dụng laravel với Nosql cụ thể ở đây là MongoDB. Nội Dung Trước tiên chúng ta đi tìm hiểu sơ qua về Laravel và NosSql. So sánh giữa Nosql và Mysql. Tiếp theo là MongoDB. Cuối cùng là cài đặt MongoDB vào Laravel Như thế nào. ...
Hôm nay mình sẽ chia sẻ cho các bạn làm thế nào để sử dụng laravel với Nosql cụ thể ở đây là MongoDB.
Nội Dung
- Trước tiên chúng ta đi tìm hiểu sơ qua về Laravel và NosSql.
- So sánh giữa Nosql và Mysql.
- Tiếp theo là MongoDB.
- Cuối cùng là cài đặt MongoDB vào Laravel Như thế nào.
Laravel
Laravel ra mắt vào cuối tháng 04-2011 nhưng đã gây được sự chú ý lớn đối với cộng đồng PHP framework. Laravel được tạo ra bởi Taylor Otwell. Nó là 1 framework khá mới mẻ nhưng bù lại nó có “hướng dẫn sử dụng” ( Document ) khá đầy đủ, rõ ràng và dễ hiểu và nhiều ưu điểm hấp dẫn. Nếu bạn đã từng làm việc với các framework khác hoặc chỉ là người mới bắt đầu tìm hiểu php framework thì việc tiếp cận laravel framework không phải là vấn đề khó khăn gì. Laravel Framework vẫn sử dụng cấu trúc MVC và trên nền tảng lập trình hướng đối tượng OOP đồng thời kế thừa được sức mạnh của các đàn anh và đem đến những tính năng mới của PHP 5.3 trở lên.
Nhưng cũng chính vì ra đời muộn màng như thế đã buộc nó phải học hỏi cái hay từ các PHP Framework đàn anh đi trước, khắc phục những thiếu xót của các framework khác như symfony (laravel dùng thư viện của symfony) và đặc biệt là CI. Không những học hỏi từ các PHP Framework, nó còn học cái hay từ Ruby on Rails, ASP.NET MVC, và Sinatra.
Chúng ta hãy điểm qua một số tính năng mạnh mẽ của Laravel
- Route trong Laravel thật sự khác biệt, mới mẻ và đầy mạnh mẻ. Mọi url đều có thể quản lý trong file route.
- Master layout được tích hợp sẵn cùng Blade template giúp code của chúng ta trên nên gọn gàng và tiện dụng. Các file layout có thể dẽ dàng extend của nhau giúp code ngắn gọn, dễ quản lý.
- Migration quản lý database thật dễ dàng khi làm việc đội nhóm.
- Eloquent class đầy mạnh mẽ nổi bật khi xử lý cơ sở dữ liệu quan hệ 1 – N và N – N, tối ưu tất cả các câu truy vấn.
- Composer quản lý và tích hợp các thư viện khác thật hay và không lo lắng khi thư viện đó bị thay đổi, laravel có đầy đủ các thư viện cơ bản đủ để thực hiện mọi yêu cầu của chúng ta.
- Document dễ đọc, dễ hiểu và có đầy đủ các ví dụ. Tuy ra đời muộn hơn các framework khác nhưng laravel lại có hướng dẫn chi tiết và đầy đủ ví dụ ngay tại trang chủ, các ví vụ để đọc đễ hiểu, cộng đồng phát triển rộng lớn.
- Eloquent ORM: đây là một ORM tuyệt vời với khả năng migration data và làm việc tốt với MySQL, Postgres, SQL Server và SQLite, MongoDB. Các câu truy vấn database dễ hiểu, nhanh chóng.
- Package-libery phong phú, đa dạng, đáp ứng được hầu hết các nhu cầu cơ bản của chúng ta.
- user authentication được tích hợp sẵn, lập trình viên chỉ cần gọi class là có thể sử dụng theo ý muốn.
Và còn nhiều những chức năng khác …
NoSQL
NoSQL là 1 dạng cơ sở dữ liệu (CSDL) mã nguồn mở không sử dụng T-SQL để truy vấn thông tin. NoSQL viết tắt bởi: None-Relational SQL, hay có những nơi thường gọi là Not-Only SQL.
NoSQL được phát triển trên Javascript Framework với kiểu dữ liệu là JSON và dạng dữ liệu theo kiểu key và value (1 đặc trưng về dữ liệu trong JSON). NoSQL ra đời như là 1 mảnh vá cho những khuyết điểm và thiếu xót cũng như hạn chế của mô hình dữ liệu quan hệ relational database management system (RDBMS) về tốc độ, tính năng, khả năng mở rộng, memory cache,...
Chắc hẳn, bất cứ ai cũng đã sử dụng một dạng CSDL quan hệ nào đó rồi, có thể là: SQL Server, MySQL. Và tất nhiên không ít lần chúng ta đã vô cùng vất vả trong việc chỉnh sửa các bảng dữ liệu khi liên quan tới khóa chính và khóa ngoại, hay một loạt các rắc rối khác trong quá trình làm việc. Bởi đó là CSDL quan hệ.Đặc biệt người dùng không thể định nghĩa được các trường mới. Mà lập trình viêc chỉ có thể định nghĩa nó từ trước.
Với NoSQL chúng ta có thể mở rộng dữ liệu mà không lo tới những việc như tạo khóa ngoại, khóa chính, kiểm tra ràng buộc, .v.v. Vì NoSQL không hạn chế việc mở rộng dữ liệu nên tồn tại nhiều nhược điểm như: sự phục thuộc của từng bản ghi, tính nhất quán, toàn vẹn dữ liệu,.... nhưng chúng ta có thể chấp nhận những nhược điểm đó để khiến ứng dụng cải thiện hiệu suất cao hơn khi giải quyết những bài toán lớn về hệ thống thông tin, phân tán hay lưu trữ dữ liệu.
Với các CSDL quan hệ, chi phí triển khai cũng như phát triển các ứng dụng sử dụng CSDL quan hệ cũng rất tốn kém và điều quan trọng được bộc lộ rõ khi truy vấn 1 lượng bản ghi lớn trong thời gian rất dài. Tiếp đó những thiết bị cầm tay như smartphone thì không phù hợp để triển khai CSDL quan hệ vì dung lượng bộ nhớ thấp và khả năng xử lý kém hơn máy tính. Và còn rất nhiều lí do khác nữa để chúng ta quyết định việc áp dụng NoSQL vào trong dự án của mình. Bạn có thể tham khảo thêm những thông tin khác về NoSQL trên mạng.
NoSQL được sử dụng ở đâu? NoSQL được sử dụng ở rất nhiều công ty, tập đoàn lớn, ví dụ như FaceBook sử dụng Cassandra, Google phát triển và sử dụng BigTable,...., và công ty mình đang làm việc sử dụng MongoDB.
NoSQL và Mysql
Các RDBMS hiện tại đã bộc lộ những yếu kém như việc đánh chỉ mục một lượng lớn dữ liệu, phân trang, hoặc phân phối luồng dữ liệu media (phim, ảnh, nhạc ...). Cơ sở dữ liệu quan hệ được thiết kế cho những mô hình dữ liệu nhỏ thường xuyên đọc viết trong khi các Social Network Services lại có một lượng dữ liệu cực lớn và cập nhật liên tục do số lượng người dùng quá nhiều ở một thời điểm. Thiết kế trên Distributed NoSQL giảm thiểu tối đa các phép tính toán, input/output liên quan kết hợp với batch processing đủ đảm bảo được yêu cầu xử lý dữ liệu của các mạng dịch vụ dữ liệu cộng đồng này. Facebook, Amazon là những ví dụ điểm hình.
Về cơ bản, các thiết kế của NoSQL lựa chọn mô hình lưu trữ tập dữ liệu theo cặp giá trị key value. Khái niệm node được sử dụng trong quản lý dữ liệu phân tán. Với các hệ thống phân tán, việc lưu trữ có chấp nhận trùng lặp dữ liệu. Một request truy vấn tới data có thể gửi tới nhiều máy cùng lúc, khi một máy nào nó bị chết cũng không ảnh hưởng nhiều tới toàn bộ hệ thống. Để đảm bảo tính real time trong các hệ thống xử lý lượng lớn dữ liệu, thông thường người ta sẽ tách biệt database ra làm 2 hoặc nhiều database. Một database nhỏ đảm bảo vào ra liên tục, khi đạt tới ngưỡng thời gian hoặc dung lượng, database nhỏ sẽ được gộp (merge) vào database lớn có thiết kế tối ưu cho phép đọc (read operation). Mô hình đó cho phép tăng cường hiệu suất input/output - một trong những nguyên nhân chính khiến performance trở nên kém.
Thế hệ CSDL mới - NoSQL - giảm thiểu tối đa các phép tính toán, tác vụ đọc-ghi liên quan kết hợp với xử lý theo lô (batch processing) đảm bảo được yêu cầu xử lý dữ liệu của các dịch vụ mạng xã hội. Hệ CSDL này có thể lưu trữ, xử lý từ lượng rất nhỏ đến hàng petabytes dữ liệu với khả năng chịu tải, chịu lỗi cao nhưng chỉ đòi hỏi về tài nguyên phần cứng thấp. Thiết kế đặc biệt tối ưu về hiệu suất, tác vụ đọc - ghi, ít đòi hỏi về phần cứng mạnh và đồng nhất, dễ dàng thêm bớt các node không ảnh hưởng tới toàn hệ thống .
Các mô hình dữ liệu đặc thù của NoSQL cung cấp API tự nhiên hơn so với việc dùng RDBMS.
Những ràng buộc về giấy phép sử dụng cùng với một khoản phí không nhỏ cũng là ưu thế. Chấp nhận NoSQL đồng nghĩa với việc bạn tham gia vào thế giới nguồn mở nơi mà bạn có khả năng tùy biến mạnh mẽ các sản phẩm, thư viện theo đúng mục đích của mình.
Sự ra đời của csdl NoSQL xuất phát từ sự bùng nổ các dịch vụ trực tuyến, dẫn đầu là các công ty như Facebook và Google. Họ đã phải đối mặt với những hạn chế của csql SQL truyền thống trong việc xử lý khối lượng dữ liệu cực lớn của mạng Internet và từ đó phát minh ra NoSQL.
Với ưu điểm về khả năng xử lý và tốc độ, mặc dù phân khúc thị trường còn ít ỏi, tốc độ tăng trưởng của NoSQL vượt trội so với SQL. Dự báo NoSQl sẽ tiếp tục giữ đà tăng trưởng này và đến năm 2017 sẽ chiếm 36% thị trường. Dựa trên những phân tích và đặc điểm của NoSql đã trình bày ở trên bạn nên khi nào quyết định sử dụng NoSql trong dự án của các bạn.
MongoDB
Tính đến thời điểm hiện tại có hơn 200 loại cơ sở dữ liệu NoSql (http://nosql-database.org), chia làm các loại:
-
Wide Column Store / Column Families: Hệ cơ sở dữ liệu cho phép truy xuất ngẫu nhiên/tức thời với khả năng lưu trữ một lượng lớn dữ liệu có cấu trúc. Dữ liệu có thể tồn tại dạng bảng với hàng tỷ bản ghi và mỗi bản ghi có thể chứa hàng triệu cột. Hệ thống triển khai từ vài trăm cho đến hàng nghìn thiết bị dẫn đến khả năng lưu trữ hàng petabytes nhưng vẫn đảm bảo hiệu năng cao. Một số sản phẩm thông dụng: Hadoop/Hbase – Apache, Bigtable Google, Cassandra - Facebook, Hypertable - Baidu, Accumulo, Amazon SimpleDB, Cloundata, Clouera...
-
Document Store: Thực chất là các cơ sở dữ liệu hướng tài liệu, một thiết kế riêng biệt cho việc lưu trữ tài liệu. Các cài đặt có thể là giả lập tương tác trên các cở sở dữ liệu quan hệ, cơ sở dữ liệu đối tượng hay key-value store. Một số sản phẩm tiêu biểu: MongoDB, Elasticsearch, Couchbase Server, CouchDB, RethinkDB.
-
Key Value / Tuple Store: Mô hình lưu trữ dữ liệu dưới dạng cặp giá trị key-value trong đó việc truy suất, xóa, cập nhật giá trị thực thông qua key tương ứng.Với sự hỗ trợ của các kĩ thuật Btree, B+Tree, Hash,… dữ liệu có thể tồn tại trên RAM hoặc ổ cứng, phân tán hoặc không phân tán.
Tuy cùng mang những đặc điểm chung của NoSQL nhưng mỗi CSDL NoSQL cũng có những đặc điểm riêng, và vì thế thường được dùng cho những dự án khác nhau.
Về MongoDB là một cơ sở dữ liệu NoSQL thuộc loại cơ sở dữ liệu hướng văn bản mã nguồn mở, có hiệu năng, tính sẵn có và tính mở rộng cao được cung cấp và hổ trợ bởi 10gen. MongoDB được 10gen phát triển từ năm 2007, đến năm 2009, MongoDB trở thành một sản phẩm mã nguồn mở có giấy phép AGPL. MongoDB được viết bằng ngôn ngữ C++, lưu trữ dữ liệu dạng BSON. Không giống như các cơ sở dữ liệu quan hệ lưu dữ cấu trúc dữ liệu theo các bảng, MongoDB lưu trữ cấu trúc dữ liệu thành văn bản dựa JSON với mô hình động (gọi là BSON) khiến cho việc tích hợp dữ liệu cho các ứng dụng trở nên dễ dàng và nhanh hơn. Với mục tiêu là kết hợp các điểm mạnh của mô hình key-value (nhanh mà tính mở rộng cao) với mô hình dữ liệu quan hệ (giàu chức năng).
Mục tiêu chính của Mongo là giữ lại các thuộc tính thân thiện của SQL. Do đó các câu truy vấn khá giống với SQL nên MongoDB khá thích hợp cho các lập trình viên đã quen với ngôn ngữ truy vấn SQL. MongoDB có một khối lượng tính năng lớn và hiệu năng cao. Với các loại dữ liệu phong phú, nhiều truy vấn và việc giảm thời gian phát triển trong việc mô hình hóa các đối tượng.
MongoDB được sử dụng tốt nhất với nhu cầu cần truy vấn động, cần tốc độ nhanh cho một cơ sở dữ liệu lớn vì MongoDB ngoài tốc độ đọc nhanh ra thì tốc độ ghi của nó rất nhanh.
MongoDB hỗ trợ việc tìm theo trường, khoảng kết quả tìm và tìm theo cú pháp. Các truy vấn có thể trả về các trường được qui định trong văn bản và cũng có thể bao gồm các hàm Javascript mà người dùng chưa định nghĩa. Cũng giống như các cơ sở dữ liệu quan hệ, bất cứ một trường nào trong MongoDB đều được đánh chỉ mục. MongoDB còn có hổ trợ theo mô hình chủ - tớ (master - slave), mảnh, vùng dữ liệu (Sharding).
MongoDB sử dụng một quá trình xử lý để xử lý các yêu cầu về dữ liệu, quản lý định dạng dữ liệu, thực hiện các hoạt động quản lý bên dưới là mongod, đây là trình xử lý chính. Trong việc mở rộng theo chiều ngang sử dụng mô hình mảnh lưu trữ, MongoDB cung cấp dịch vụ xử lý các truy vấn từ tầng ứng dụng, xác định vị trí dữ liệu trong cụm các node phân mảnh được gọi là mongo.
Toàn bộ những phần trê là lý thuyết về Laravel và Nosql, Mong rằng những ai chưa hiểu rõ về Laravel và MongoDB có thêm chút kiến thức để chúng ta bắt đầu.
phần tiếp theo tôi sẽ hướng dẫn các bạn tích hợp MongoDB với Laravel.
Laravel và MongoDB
Trong bài viết này tôi sẽ hướng dẫn các bạn dùng thư viện jenssegers/laravel-mongodb để tích hợp với laravel. Các bạn có thể tham khao trực tiếp thư viện tại đây: jenssegers/laravel-mongodb. Tại sao tôi lại chọn thư viện này bởi vì nó cho phép các bạn có thể thực hiện các câu truy vấn giống như laravel với mysql. Nó không làm mất đi một phần sức mạnh của laravel framwork. (An Eloquent model and Query builder with support for MongoDB, using the original Laravel API. This library extends the original Laravel classes, so it uses exactly the same methods)
Cài đặt
Tôi hi vọng rằng khi các bạn xem bài viết này thì tất cả đều đã cài đặt thành công Laravel trên máy của các bạn rồi, nếu ai chưa cài được thì có thể tìm trên trang web này có những bài viết hướng dẫn rất chi tiết về cài đặt laravel trên local.
Cài đặt MongoDB
trong bài này mình sẽ hướng dẫn các bạn cài đặt trên môi trường windown. Đối với linux hay macos nó còn dễ dàng cài đặt hơn nữa.
- Đầu tiền các Bạn có thể Download MongoDB Tại đây file msi và chọn phiên bản phù hợp với phiên bản windown của các bạn.
- Sau đó các bạn tạo thư mục mongodb trong ổ C và tạo tiếp 2 thư mục con trong đó là data và bin:
-
Giải nén file msi đã down ở bước 1 và copy toàn bộ vào thư mục bin vừa tạo.
-
tiếp theo mở CMD lên và cd đến thư mục bin vừa tạo các bạn gõ lệnh sau
C:mongodbinmongod.exe --install --logpath C:mongodblog.txt --dbpath C:mongodbdata
vậy là xong rồi, các bạn chạy tiếp lệnh:
net start mongodb
để khởi start mongo lên nhé.
Cài đặt Thư Viện Jenssegers
- Các Bạn mở CMD của windown và cd đến thư mục đã cài đặt laravel và chạy dòng lệnh sau:
composer require jenssegers/mongodb
hoặc cũng có thể mở file conposer.json lên thêm vào dòng sau ở trong require:
"jenssegers/mongodb": "~2.1",
Sau khi chạy lệnh hoặc thêm vào nó sẽ như thế này:
"require": { "laravel/framework": "5.0.*", "jenssegers/mongodb": "~2.1", "guzzlehttp/guzzle": "~5.0", ...
- Nếu thêm bằng tay thì cần chạy lệnh
composer update
để lấy thư viện về nhé.
- Tiếp theo mở file app/config và thêm dòng sau vào providers:
JenssegersMongodbMongodbServiceProvider::class,
ok như vậy là đã tích hợp thành công laravel với thư viện rồi, tiếp theo tôi sẽ hướng dẫn các bạn cài đặt MongoDB PHP drive và config database cho mongoDB và các câu truy vấn cơ bản nữa.
Cài đặt Mongo Driver
- Đầu tiên các bạn vào Đây để download driver tương ứng với phiên bản windown của mình nhé.
- Giải nén chúng ra bạn sẽ thu dược các file php_mongo.dll, copy file này vào thư mục extension của php, mặc định sẽ là thư mục "ext".
- add extension=php_mongo.dll vào file php.ini
- Restart Apache nếu không thấy báo lỗi tức là đã cài đặt thành công, còn không thì các bạn cần tìm file dll khác để copy vào cho đúng phiên bản php của mình nhé.
Cogfig Database
- Vào Config/Database.php của laravel chuyển 'default' => 'mongodb' và add
'connections' => [ 'mongodb' => [ 'driver' => 'mongodb', 'host' => 'localhost', 'port' => 27017, 'username' => ', 'password' => ', 'database' => 'mongodb' ],
Nếu mongo có user và password cần điền vào trên (chú ý trên đây là config của laravel 4 và 5 nếu là 5.2 các bạn có thể tham khao trực tiếp trên github (xem link ở cuối bài) để cấu hình cho phù hợp).
Let Work Now
Khi đã cài đặt hoàn tất ta có thể dễ dàng làm việc rồi, ok bắt đầu query nào:
Model
Khai báo một model user với table là user.
use JenssegersMongodbEloquentModel as Eloquent; class User extends Eloquent { protected $collection = 'users'; }
Query Builder
lấy toàn bộ dữ liệu trong bảng user:
$users = DB::collection('users')->get(); $users = User::all(); $user = DB::collection('users')->where('name', 'John')->first();
bạn cũng có thể kết nối với một database khác để truy vấn.
$user = DB::connection('new_databse')->collection('users')->get();
Chú ý trường hợp này bạn phải định nghĩa new_database trong file Config/Database, cách định nghĩ tương tự như trên.
Các Ví Dụ Khác
- Lấy tất cả model:
$users = User::all();
- Lấy theo Primary Key
$user = User::find('517c43667db388101e00000f');
- Wheres
$users = User::where('votes', '>', 100)->take(10)->get(); $users = User::where('votes', '>', 100)->orWhere('name', 'John')->get(); $users = User::where('votes', '>', 100)->where('name', '=', 'John')->get(); $users = User::whereIn('age', [16, 18, 20])->get(); $users = User::whereBetween('votes', [1, 100])->get(); $users = User::whereNull('updated_at')->get();
- Order By
$users = User::orderBy('name', 'desc')->get();
- Offset & Limit
$users = User::skip(10)->take(5)->get();
- Group By
$users = Users::groupBy('title')->get(['title', 'name']);
- Aggregation
$total = Order::count(); $price = Order::max('price'); $price = Order::min('price'); $price = Order::avg('price'); $total = Order::sum('price'); $sold = Orders::where('sold', true)->sum('price');
Inserts, updates and deletes
- Saving a new model
$user = new User; $user->name = 'John'; $user->save();
bạn cũng có thể sử dụng
User::create(['name' => 'John']);
- Updating a model
$user = User::first(); $user->email = 'john@foo.com'; $user->save();
- Deleting a model
$user = User::first(); $user->delete(); User::destroy('517c43667db388101e00000f');
Relations
Supported relations are:
- hasOne
- hasMany
- belongsTo
- belongsToMany
- embedsOne
- embedsMany
use JenssegersMongodbEloquentModel as Eloquent; class User extends Eloquent { public function items() { return $this->hasMany('Item'); } }
phần này nó hoàn toàn tương tự với mysql các bạn có thể tham khảo thêm trên trang chủ của laravel.
ngoài ra thư viện còn hỗ trợ thêm các kiểu liên kết đặc trưng cuả mongodb như:
- EmbedsMany Relations
use JenssegersMongodbEloquentModel as Eloquent; class Book extends Eloquent { public function author() { return $this->embedsOne('Author'); } }
lấy giá trị bằng cách
$author = Book::first()->author;
MongoDB specific operations
ngoài ra thư viện còn hỗ trợ một số câu truy vấn đặc biệt của mongo như.
- Cursor timeout
bạn có thể set timeout cho câu truy vấn
DB::collection('users')->timeout(-1)->get();
- Upsert
update nếu tồn tại, inser nếu chưa tồn tại
DB::collection('users')->where('name', 'John') ->update($data, ['upsert' => true]);
- Pagination
phân trang
$limit = 25; $projections = ['id', 'name']; DB::collection('items')->paginate($limit, $projections);
- Push thêm một item vào array
DB::collection('users')->where('name', 'John')->push('items', 'boots'); DB::collection('users')->where('name', 'John')->push('messages', ['from' => 'Jane Doe', 'message' => 'Hi John']);
- pull
xóa 1 items trong array
DB::collection('users')->where('name', 'John')->pull('items', 'boots'); DB::collection('users')->where('name', 'John')->pull('messages', ['from' => 'Jane Doe', 'message' => 'Hi John']);
- Unset
Xóa một item trong document, cái này khá quan trong khi bạn muốn thay đổi một document nào trong database của các bạn
DB::collection('users')->where('name', 'John')->unset('note');
Trên đây là một số câu query hay dùng tôi muốn chia sẻ với các bạn, nếu muốn tìm hiểu thêm các câu query khác vui lòng vào ĐÂY để xem thêm nhé.
Nếu bạn có thắc mắc hay câu hỏi nào vui lòng để lại comment phía dưới, tác giả sẽ cố gắng giải đáp thắc mắc của bạn trong thời gian sớm nhất.
Thank you for reading!
**