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à 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, [string $more_columns,] | array $filter 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, [array $conditions] 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 $viewname 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, [string $operator,] mixed $value 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, [string $direction] 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$cache 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 $limit Ví dụ:

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

rows_limit Params: int $limit Ví dụ:

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

offset Params: int $offset Ví dụ:

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

rows_offset Params: int $offset 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. Tài liệu tham khảo

  1. https://fuelphp.com/docs/index.html
  2. https://fuelphp.com/docs/packages/orm/crud.html#/crud
  3. https://fuelphp.com/

All Rights Reserved