Active Record trong Yii2

0
470

Active Record mà yii2 cung cấp cho chúng ta 1 cách tiếp cận hướng đối tượng giúp ta truy cập và tương tác như tạo,update với cơ sở dữ liệu .Yii2 sẽ coi 1 bảng cơ sở dữ liệu là 1 đối tượng .Cái này mình thích vì vừa nhanh vừa đơn giản quá trình xử lý

Active Record làm việc với hầu hết các extention hiện hành mà mọi người hay dùng như ElasticSearch,Sphinx,Redis,MongoDB,MySql .

Dưới đây là 2 đoạn mã bạn coi và xem ưu thế của active record nhé

$article = new Article();
$article ->title= 'Nguyen Anh Hien';
$article ->save();

Và đoạn mã bằng sql trong yii2

$db->createCommand('INSERT INTO `article` (`title`) VALUES (:title)', [
    ':title' => 'Nguyen Anh Hien',
])->execute();

Trước khi làm việc với active record chúng ta cần phải cấu hình database trong main.php

return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=demoyii2',
            'username' => 'root',
            'password' => '',
        ],
    ],
];

Phương thức khai báo active record cơ bản

Khai báo cực kì đơn giản đối với active record mà bạn có thể tham khảo .Ở đây mình lấy ví dụ thực tế của mình xử lý bài viết

<?php

namespace common\models;

use Yii;
use yii\behaviors\SluggableBehavior;
/**
 * This is the model class for table "article".
 *
 * @property integer $article_id
 * @property string $article_title
 * @property string $article_desc
 * @property string $article_keywords
 * @property string $article_body
 * @property integer $article_view
 * @property integer $article_author
 */
class Article extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'article';
    }
}

Quá trình khai báo rất đơn giản vô cùng

Truy vấn data

Chúng ta truy vấn data trong activer record 1 cách đơn giản thông qua hàm find()

// return a single article whose article_id is 123
// SELECT * FROM `article` WHERE `article_id` = 123
$article = article::find()
    ->where(['article_id' => 123])
    ->one();

// return all active customers and order them by their IDs
// SELECT * FROM `article` WHERE `status` = 1 ORDER BY `article_id`
$customers = article::find()
    ->where(['status' => article::STATUS_ACTIVE])
    ->orderBy('article_id')
    ->all();

// return the number of active customers
// SELECT COUNT(*) FROM `article` WHERE `status` = 1
$count = article::find()
    ->where(['status' => article::STATUS_ACTIVE])
    ->count();

// return all customers in an array indexed by article IDs
// SELECT * FROM `article`
$customers = article::find()
    ->indexBy('article_id')
    ->all();

Chúng ta thấy rằng quá trình xử lý find() rất đơn giản .Dưới đây chúng ta sẽ đi tìm hiểu cách dùng hàm find() rút gọn bằng 2 hàm findOne() và findAll()

// returns a single article whose article_id is 123
// SELECT * FROM `article` WHERE `article_id` = 123
$article = article::findOne(123);

// returns article whose article_id is 100, 101, 123 or 124
// SELECT * FROM `article` WHERE `article_id` IN (100, 101, 123, 124)
$article = article::findAll([100, 101, 123, 124]);

// returns an active article whose article_id is 123
// SELECT * FROM `article` WHERE `article_id` = 123 AND `status` = 1
$article = article::findOne([
    'article_id' => 123,
    'status' => article::STATUS_ACTIVE,
]);

// returns all inactive article
// SELECT * FROM `article` WHERE `status` = 0
$article = article::findAll([
    'status' => article::STATUS_INACTIVE,
]);

Các hàm trong find nếu ko để gì nó sẽ mặc định tìm theo khóa chính của bảng .Active Record có đầy đủ hàm xử lý như thêm,cập nhật,xóa ,thay thế dữ liệu bên cạnh đó còn có vài chức năng nâng cao .Chúng ta sẽ lần lượt tìm hiểu nhé

Chức năng lưu ,update dữ liệu trong active record

Save và update database trong active record thực sự rất đơn giản .Đầu tiên bạn khởi tạo 1 object active record

// thêm 1 dòng data mới
$article = new Article();
$article->author = 'James';
$article->save();

// update dữ liệu đã tồn tại
$article = Article::findOne(123);
$article->email = 'admin@hbsprogram.com';
$article->save();

Updating Counters

Có nhiệm vụ updates dữ liệu trong 1 bảng tăng hay giảm 1 số .Chức năng này rất hay trong việc đếm số người đã xem

$post = Post::findOne(4); 
// UPDATE `post` SET `view_count` = `view_count` + 1 WHERE `id` = 4
$post->updateCounters(['view_count' => 1]);

Updating Multiple Rows

Update nhiều cột có chức năng giúp bạn update 1 hàng loạt dữ liệu thêm 1 hằng số nhất định như sang năm mới cập nhật số tuổi của thành viên +1

// UPDATE `user` SET `status` = 1 WHERE `email` LIKE `%@example.com%`
User::updateAll(['status' => User::STATUS_ACTIVE], ['like', 'email', '@example.com']);

// UPDATE `user` SET `age` = `age` + 1
User::updateAllCounters(['age' => 1]);

Deleting Dữ liệu

$customer = Customer::findOne(23);
$customer->delete();

Delete dữ liệu 1 cách nhanh chóng bằng activer record .Ở phần sau mình sẽ làm việc với các bản có dữ liệu liên quan đến nhau