12/08/2018, 15:37

Giới thiệu về Fuel PHP và Orm CRUD trong Fuel PHP

1. Fuel PHP FuelPHP là một framework đơn giản, linh hoạt, hướng cộng đồng và được viết mới hoàn toàn dựa trên PHP 5.3+ với những ý tưởng tốt nhất của các framework khác. FuelPHP được xây dựng theo mô hình MVC, có hỗ trợ đầy đủ mô hình HMVC. Ngoài ra FuelPHP cũng hỗ trợ thêm một khái niệm gọi là ...

1. Fuel PHP

FuelPHP là một framework đơn giản, linh hoạt, hướng cộng đồng và được viết mới hoàn toàn dựa trên PHP 5.3+ với những ý tưởng tốt nhất của các framework khác. FuelPHP được xây dựng theo mô hình MVC, có hỗ trợ đầy đủ mô hình HMVC. Ngoài ra FuelPHP cũng hỗ trợ thêm một khái niệm gọi là ViewModel, đây là tầng đứng giữa Controller và View, tại đây có chúng ta có thể viết một phần của business login để cho Controller đỡ bị rối rắm. FuelPHP cũng cung cấp cơ chế router mạnh mẽ, dễ sử dụng, giúp bạn có thể viết các luật url của riêng mình một cách dễ dàng. FuelPHP có driver cho nhiều loại hình cơ sở dữ liệu khác nhau, mysql, mongo, redis…

2. Orm

Orm là viết tắt của Object Relational Mapper, nó thực hiên 2 nhiệm vụ là: map các hàng của bảng cơ sở dữ liệu thành các đối tượng và cho phép bạn thiết lập mối quan hệ giữa các đối tượng đó.

3. CRUD: Create, Read, Update and Delete

Khi bạn đã cấu hình Model, bạn có thể bắt đầu thêm, sửa, xóa, đọc các bản ghi trong cơ sở dữ liệu.

- Create

Ví dụ:

// option 1
$new = new Model_Example();
$new->property = 'something';
$new->save();

// option 2, use forge instead of new
$new = Model_Example::forge();
$new->property = 'something';
$new->save();

Sau khi thực hiện save() thành công, nếu cơ sở dữ liệu bạn thiết lập auto_increment cho khóa chính thì nó sẽ tự động thiết lập khóa chính bản ghi được lưu thành công đó. Một cách thiết lập thuộc tính khác cho model là sử dụng mảng Ví dụ:

$props = array('property' => 'something');

// using "new"
$new = new Model_Example($props);
$new->save();

// option 2, use forge instead of new
$new = Model_Example::forge($props);
$new->save();

- Read

Các cách để tìm kiếm dữ liệu: tìm theo một id cụ thể (primary key), tìm first/last, hay tất cả các bản ghi thỏa mãn điều kiện.

Find by ID Ví dụ:

// you know there's an article with ID=2
$entry = Model_Article::find(2);

// ...or when using compound primary keys
$entry = Model_Article::find(array(2, 'foo'));

Trong ví dụ này, nó sẽ trả về một instance của Model_Article hoặc null khi không tìm thấy ID.

Find first/last Ví dụ:

// find the first entry
$entry = Model_Article::find('first');

// find the last entry added when ordered by date
$entry = Model_Article::find('last', array('order_by' => 'date'));

Trong ví dụ này, nó sẽ trả về một instance của Model_Article hoặc null khi không tìm thấy ID.

Find all Ví dụ:

// find all articles
$entry = Model_Article::find('all');

// find all articles from category 1 order descending by date
$entry = Model_Article::find('all', array(
    'where' => array(
        array('category_id', 1),
    ),
    'order_by' => array('date' => 'desc'),
));

// find all articles from category 1 or category 2
$entry = Model_Article::find('all', array(
    'where' => array(
        array('category_id', 1),
        'or' => array(
            array('category_id', 2),
        ),
    ),
));

Trong ví dụ này, nó sẽ luôn trả về một mảng instance của Model_Article.

Find using method chaining Ví dụ:

$query = Model_Article::query()->where('category_id', 1)->order_by('date', 'desc');

// We want to know the total number of articles for pagination
$number_of_articles = $query->count();

// We want to know the last id issued
$number_of_articles = $query->max('id');

// We want to know the date of the first article posted
$number_of_articles = $query->min('date');

// fetch one Article
$newest_article = $query->get_one();

// we re-use but add a return limitation to the previous query to fetch multiple articles
$all_articles = $query->limit(15)->get();

Converting to an array

Bạn có thể ép kiểu một kết quả truy vấn duy nhất sang một mảng bằng cách sử dụng phương thức to_array () Ví dụ:

// using the chaining method. select one row and convert it to an array
$entry = Model_Article::query()->where('id', '=', 8)->get_one()->to_array();

// select one row, convert it to an array, include custom data and also run recursivly
$entry = Model_Article::query()->where('id', '=', 8)->get_one()->to_array(true, true);

// select one row and convert it to an array, include custom data, run recursivly and get eav relations
$entry = Model_Article::query()->where('id', '=', 8)->get_one()->to_array(true, true, true)

Partial column selects Theo mặc định, tất cả các phương pháp truy vấn tìm kiếm đều trả về tất cả các cột trong bảng, tương ứng với tất cả các thuộc tính. Để tìm kiếm các thuộc tính mong muốn, có thể sử dụng phương thức select() Ví dụ:

// using the array method. select only the 'name' and 'date' columns
$entry = Model_Article::find('last', array('select' => array('name', 'date')));

// same, but then using the chaining method
$entry = Model_Article::query()->select('name', 'date')->get();

// using the array method. select all columns except the 'date' column
$entry = Model_Article::find('all', array('select' => array(array('date' => false))));

// same, but then using the chaining method
$entry = Model_Article::query()->select(array('date' => false))->get();

- Update

Ví du:

$entry = Model_Article::find(4);
$entry->title = 'My first edit';
$entry->author = 'Total n00b';
$entry->save();

Trong ví dụ trên: đối tượng sẽ được tìm kiếm theo id cụ thể, sau đó được thay đổi thuộc tính và được lưu lại. Bạn cũng có thể thay đổi giá trị thuộc tính sử dụng mảng. Ví dụ:

$entry = Model_Article::find(4);
$entry->set(array(
    'title'  => 'My first edit',
    'author' => 'Total n00b'
));

$entry->save();

- Delete

Ví dụ:

$entry = Model_Article::find(4);
$entry->delete();

Ví dụ trên: đối tượng sẽ được tìm và xóa. Nếu bạn thực hiện lệnh xóa, sau đó thực hiện lệnh update bản ghi bạn vưà xóa, khóa chính sẽ không được tìm thấy, nó sẽ được thiết lập là null, khi đó chính bản ghi sẽ được coi như một bản ghi mới và được lưu lại trong cơ sở dữ liệu với một khóa chính (primary key) mới.

- All selection methods when using find

Các phương thức khi sử dụng find() select Params: string column,[stringcolumn, [string column,[stringmore_columns,] | array $$ilter Ví du:

// Find only some columns
Model_Article::query()->select('id', 'name');
Model_Article::find('all', array('select' => array('id', 'name')));

// Find all columns except 'name'
Model_Article::query()->select(array('name' => false));
Model_Article::find('all', array('select' => array(array('name' => false))));

related Params: string|array relation,[arrayrelation, [array relation,[arrayconditions] Ví dụ:

// include related models in the find
Model_Article::query()->related(array('author', 'comments'));
Model_Article::find('all', array('related' => array('author', 'comments')));

//=============================
// Include one or more conditions on a relation (only supported when chaining)
//=============================

// First method - using an array
//----------------------------
// one condition
Model_Article::query()
    ->related('author', array('where' => array(array('active', '=', 1))));

// multiple conditions
Model_Article::query()
    ->related('author', array('where' => array(array('active', '=', 1), array('status', '=', 'X'))));

// Second method - use dot notation
//----------------------------
// one condition
Model_Article::query()
    ->related('author')
    ->where('author.active', 1);

// multiple conditions
Model_Article::query()
    ->related('author')
    ->where('author.active', 1);
    ->where('author.status', 1);

use_view Params: string $$iewname Ví dụ:

// use a view to retrieve data
Model_Article::query()->use_view('with_comments');
Model_Article::find('all', array('use_view' => 'with_comments'));

where Params: string column,[stringcolumn, [string column,[stringoperator,] mixed $$alue Ví dụ:

// Single where
Model_Article::query()->where('id', 4);
Model_Article::find('all', array('where' => array('category_id' => 5)));

// Multiple where usage examples
Model_Article::query()->where('id', 4)->where('category_id', '>', 1);
Model_Article::query()->where(array('id' => 4, 'category_id' => 6));
Model_Article::find('all', array('where' => array(array('category_id', '=', 5), array('publish', '<', time()))));

// Using or where
Model_Article::query()->where('id', 4)->or_where('id', 5);

order_by Params: string column,[stringcolumn, [string column,[stringdirection] Ví dụ:

// Single order_by
Model_Article::query()->order_by('name', 'desc');
Model_Article::find('all', array('order_by' => array('name' => 'desc')));

// Multiple order_by usage examples
Model_Article::query()->order_by('name', 'desc')->order_by('category_id', 'asc');
Model_Article::query()->order_by(array('name' => 'desc', 'category_id' => 'asc'));
Model_Article::find('all', array('order_by' => array(array('name' => 'desc', 'category_id' => 'asc'))));

from_cache Params: bool$$ache Ví dụ:

// disable the ORM object cache on this query
Model_Article::query()->from_cache(false);
Model_Article::find('all', array('from_cache' => false));

limit Params: int $$imit Ví dụ:

// limit with relation consistence
Model_Article::query()->limit(10);
Model_Article::find('all', array('limit' => 10));

rows_limit Params: int $$imit Ví dụ:

// limit without relation consistence
Model_Article::query()->rows_limit(10);
Model_Article::find('all', array('rows_limit' => 10));

offset Params: int $$ffset Ví dụ:

// offset with relation consistence
Model_Article::query()->offset(10);
Model_Article::find('all', array('offset' => 10));

rows_offset Params: int $$ffset Ví dụ:

// offset without relation consistence
Model_Article::query()->rows_offset(10);
Model_Article::find('all', array('rows_offset' => 10));

Không nên trộn lẫn limit/offset. Sự kết hợp giữa limit và rows_offset sẽ đưa ra một kết quả không đoán định trước được. Trong bối cảnh này, relation consistence có nghĩa là theo mặc định khi bạn truy vấn bao gồm các model quan hệ của nó, ORM sẽ đảm bảo rằng các kết quả liên quan thích hợp. Điều này có nghĩa là kết quả của bạn không phải lúc nào cũng chính xác. Ví dụ: nếu the first parent trong kết quả có 12 children, kết quả của bạn sẽ chứa 12 bản ghi ngay cả khi bạn đã sử dụng limit (10). Khi bạn sử dụng rows_limit (10), kết quả sẽ chỉ chứa 10 bản ghi, nhưng 2 bản ghi liên quan sẽ bị thiếu, và không thể được lấy ra sau đó vì kết quả sẽ được lưu trữ và xử lý bộ nhớ cache không biết kết quả là chưa đầy đủ.

- Complex where clauses

Sử dụng chuỗi bạn có thể tạo các mệnh đề where phức tạp hơn , sử dụng and, or và nesting. Ví dụ:

// complex where clause
Model_Article::query()
  ->where('author', '=', 16)
  ->and_where_open()
      ->where('date', '<', time())
      ->or_where('draft', '=', 1)
  ->and_where_close();

// creates WHERE `author` = 16 AND (`date` < 1348404127 OR `draft` = 1)

Để tạo một OR được lồng nhau, sử dụng or_where_open () và or_where_close (). Luôn đảm bảo open và close method phù hợp!

- Subqueries

Các truy vấn con có thể được tạo ra bằng cách xây dựng một đối tượng truy vấn riêng biệt và sử dụng get_query () để phân tích cú pháp. Ví dụ:

$subQuery = Model_Article::query()
        ->select('author')
        ->where('date', '<', time())
        ->where('draft', '=', 1);

Model_Article::query()
        ->where('author', '=', 16)
        ->or_where('author', $subQuery->get_query(true))
        ->get();

- Custom SQL

Cũng có thể thực hiện các truy vấn SQL tùy chỉnh và có kết quả trả về dưới dạng model Orm (hoặc danh sách cácmodel). Mặc dù đây không phải là một phần của Orm nhưng nó sẽ là hữu ích hơn khi biết. Hãy xem hàm DB :: query () để biết thêm thông tin. Ví dụ:

DB::query('SELECT * FROMarticlesWHEREid= 1')->as_object('Model_Article')->execute();

Bạn nên sử dụng hàm query () ở bất kỳ nơi nào có thể

4.

Bài liên quan

Giới thiệu về 2D Array – mảng 2 chiều trong JavaScript

Quản Trị Mạng - Trong bài viết dưới đây, chúng tôi sẽ giới thiệu và hướng dẫn các bạn một số thao tác cơ bản để tạo và truy cập tới mảng 2 chiều – 2D array trong JavaScript. Về mặt bản chất, mảng 2 chiều là khái niệm về chuỗi các ma trận – matrix, được sử dụng để ...

Bùi Văn Nam viết 10:57 ngày 22/08/2018

Truy Vấn Chân Kinh - Phần một: Giới thiệu về Active Record và một vài phương thức truy vấn cơ bản không phải ai cũng biết

Mở đầu Đây là phần mở đầu cho cuốn Truy Vấn Chân Kinh trong bộ series hướng dẫn về Ruby on Rails mà mình sẽ gắng công biên soạn trong thời gian sắp tới. Uớc tính bộ này sẽ gồm ít nhất sáu phần, bao quát những mảng kiến thức thú vị và hay ho liên quan đến các vấn đề về truy vấn trong Ruby on ...

Bùi Văn Nam viết 18:17 ngày 12/08/2018

Giới thiệu về cloud formation và cách sử dụng cơ bản

Cloud formation là gì? Cách dễ nhất để mô tả CloudFormation là nó là một công cụ từ AWS cho phép bạn khởi tạo tài nguyên một cách dễ dàng. Bạn xác định tất cả các tài nguyên mà bạn muốn AWS bật lên trong một bản thiết kế chi tiết, bấm vào một nút, và sau đó AWS sẽ thực hiện giúp bạn phần việc còn ...

Tạ Quốc Bảo viết 17:44 ngày 12/08/2018

Giới thiệu về Notification Channels và Badges trên Android O

1. Introduction Notification channels và Badges là một trong nhiều tính năng được update trên Android O. Bắt đầu từ Android O, tất cả các notification của bạn sẽ được chia vào các Notification channels khách nhau, tùy thuộc vào từng loại notification mà app gửi đi. Bằng việc sử dụng các channel ...

Tạ Quốc Bảo viết 17:28 ngày 12/08/2018

Angular 2 căn bản - Phần 1: Giới thiệu về angular 2 và tạo web app đơn giản

1. Angular 2 là gì? Như các bạn đã biết, hiện có rất nhiều các framework về javascript trên thị trường như ReactJS, Vue.js, AngularJS.... Và trong bài viết này, mình sẽ giới thiệu đến các bạn một trong những framework được cho là tốt nhất hiện nay, đó là Angular 2. Và phiên bản này của Google ...

Bùi Văn Nam viết 16:06 ngày 12/08/2018
0