Phalcon入門チュートリアルのモデルCURD(2)

5313 ワード

原文:Phalcon入門チュートリアルのモデルCURD(2)
前回のPhalcon入門チュートリアルのモデルCURD(1)ではPhalconモデルのinsertselectの操作を紹介し、本編ではupdatedeleteの使い方を紹介します.本文で使用したサンプルコードは、前編のデータテーブルに沿って使用され、ここでは後述しない.
レコードの更新Phalconモデル更新レコードのサンプルコードは以下の通りである.
$articleModel = new ArticlesModel();
//    findFirst()       ,          
$article = $articleModel->findFirst([
    'conditions' => 'aid = :aid:',
    'bind' => [
        'aid' => 3
    ],
]);
if($article) {
    //            update()         
    $result = $article->update([
        'title' => 'Phalcon    1',
    ]);
    //update()       boolean
    var_dump($result);
}

傍受されたSQL文は次のとおりです.
SELECT * FROM `test_articles` WHERE `test_articles`.`aid` = :aid LIMIT :APL0

UPDATE `test_articles` SET `title` = ?, `introduce` = ?, `status` = ?, `view_number` = ?, `is_recommend` = ?, `is_top` = ?, `create_by` = ?, `create_time` = ?, `modify_by` = ?, `modify_time` = ? WHERE `aid` = ?

コードとSQL文から、update()関数を呼び出す前に、findFirst()関数を呼び出してレコードを取得する必要があることがわかります.これは、update()関数の内部では更新条件としてプライマリ・キーがデフォルトで使用されているため、update()関数は条件というパラメータを更新せず、プライマリ・キーのみで更新できます.しかし、更新操作を実行するたびに、2つのSQL文(select以降update)が実行され、パフォーマンスが損なわれます.次に、update SQL文を1つだけ実行する方法を説明します(プライマリ・キー値がわかっていることを前提とします).
$articleModel = new ArticlesModel();
$articleModel->aid = 3;  //          
$result = $articleModel->update([
    'title' => 'Phalcon    ',
]);

上記のコードが実行されると、例外が放出されます.
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'introduce' cannot be null
introduceフィールドの値は空にできません.前に傍受したupdate SQL文を振り返り、update()関数を実行すると、test_articlesテーブルのすべてのフィールドが更新されます.すなわち、update()関数を呼び出す場合、テーブル内のすべてのフィールドを更新する必要があり、あるフィールドまたは一部のフィールドのみを更新することはできないので、ここでは、すべてのフィールドをパラメータとして入力する必要があります.
$articleModel = new ArticlesModel();
$articleModel->aid = 3;
$result = $articleModel->update([
    'title' => 'Phalcon    ',
    'introduce' => "Phalcon    2",
    'status' => 2,
    'view_number' => 2,
    'is_recommend' => 1,
    'is_top' => 1,
    'create_by' => 1,
    'create_time' => date('Y-m-d H:i:s'),
    'modify_by' => 1,
    'modify_time' => date('Y-m-d H:i:s')
]);
if(!$result){
    throw new \Exception('      ');
}
//      (  DI            “db”)
$affectedRows = $this->getDI()->get('db')->affectedRows();

データを更新するたびに、すべてのフィールドを更新する必要があります.明らかに私たちの中国の多くの開発者の習慣に合わないので、一部のフィールドだけを更新する方法はありませんか.
部分フィールドの更新
オリジナルSQLを書くか、PHQLで更新部分フィールドを実現できるほか、Phalconには直接使用できる関数は提供されていません.しかし、私たちは他の方法で曲線で国を救うことができます.次は私のパッケージの関数です.
    //    :marser/app/frontend/models/ArticlesModel.php

    /**
     *   phalcon model update  ,           ,        
     * @param array|null $data
     * @param null $whiteList
     * @return bool
     */
    public function iupdate(array $data = null, $whiteList = null)
    {
        if (count($data) > 0) {
            //                
            $attributes = $this->getModelsMetaData()->getAttributes($this);
            //                  ,   
            $this->skipAttributesOnUpdate(array_diff($attributes, array_keys($data)));
        }
        return parent::update($data, $whiteList);
    }

関数は簡単で、現在のモデルに対応するデータテーブルのすべてのフィールドを取得し、更新する必要があるデータフィールドとの間に差セットを取り、skipAttributesOnUpdate関数を呼び出してフィルタリングします.上記の更新フィールドのサンプルコードは、次のように変更できます.
$articleModel = new ArticlesModel();
$articleModel->aid = 3;
//        
$result = $articleModel->iupdate([
    'title' => 'Phalcon    ',
]);
if(!$result){
    throw new \Exception('      ');
}
$affectedRows = $this->getDI()->get('db')->affectedRows();

これで更新に成功し、影響行数を取得できます.ここでは,Phalconモデルのupdate()関数に注意点がある.更新されたデータとテーブル内のデータが同じである場合、update()関数はtrue値を返しますが、影響行数は0です.
save() Phalconモデルのsave()関数は、現在のモデルオブジェクトのプライマリ・キー・メンバー属性に値があるかどうかを判断し、値がある場合は、update()関数を内部呼び出して更新操作を実行する.値がない場合は、create()関数を内部呼び出して挿入操作を実行します.
レコードの削除
削除レコードは更新レコードと同様に、findFirst()を呼び出した後、delete()関数を呼び出してデータを削除します.プライマリ・キーの場合は、プライマリ・キー・メンバーのプロパティに直接値を割り当てることもできます.
$articleModel = new ArticlesModel();
$articleModel->aid = 4;
$result = $articleModel->delete();
$affectedRows = $this->getDI()->get('db')->affectedRows();

なお、delete()は、プライマリ・キーIDが存在するかどうかにかかわらず、trueの値を返し、ロー数に影響を与えると正常に返される.したがって,影響行数に基づいて実行に成功したか否かを判断することを提案する.一括削除が必要な場合や、削除条件として非プライマリ・キーを使用する場合は、元のSQLまたはPHQLでデータを削除するしかなく、もちろん自分で関数をカプセル化することもできます.
上記のコードはgithubに管理されています.https://github.com/KevinJay/m...
最後に、QQグループの交流討論に参加することを歓迎します.
  • 広州PHPハイエンド交流群:158587573
  • Phalconプレイヤーグループ:150237524