Phalcon入門チュートリアルのモデルCURD(2)
5313 ワード
原文:Phalcon入門チュートリアルのモデルCURD(2)
前回のPhalcon入門チュートリアルのモデルCURD(1)では
レコードの更新
傍受されたSQL文は次のとおりです.
コードとSQL文から、
上記のコードが実行されると、例外が放出されます.
データを更新するたびに、すべてのフィールドを更新する必要があります.明らかに私たちの中国の多くの開発者の習慣に合わないので、一部のフィールドだけを更新する方法はありませんか.
部分フィールドの更新
オリジナルSQLを書くか、PHQLで更新部分フィールドを実現できるほか、
関数は簡単で、現在のモデルに対応するデータテーブルのすべてのフィールドを取得し、更新する必要があるデータフィールドとの間に差セットを取り、
これで更新に成功し、影響行数を取得できます.ここでは,
save()
レコードの削除
削除レコードは更新レコードと同様に、
なお、
上記のコードはgithubに管理されています.https://github.com/KevinJay/m...
最後に、QQグループの交流討論に参加することを歓迎します.広州PHPハイエンド交流群:158587573 Phalconプレイヤーグループ:150237524
前回のPhalcon入門チュートリアルのモデルCURD(1)では
Phalcon
モデルのinsert
とselect
の操作を紹介し、本編ではupdate
とdelete
の使い方を紹介します.本文で使用したサンプルコードは、前編のデータテーブルに沿って使用され、ここでは後述しない.レコードの更新
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グループの交流討論に参加することを歓迎します.