构建自己的PHP框架实现Model类(3)
在之前的博客中,我们实现并完善了Model类的findOne方法,下面我们来实现其中的其他方法。
先来看findAll方法,这个方法和findOne很相似。
public static function findOne($condition = null) { $sql = 'select * from ' . static::tableName(); $params = []; // 判空 if (!empty($condition)) { $sql .= ' where '; $params = array_values($condition); $keys = []; foreach ($condition as $key => $value) { array_push($keys, "$key = ?"); } $sql .= implode(' and ', $keys); } $stmt = static::getDb()->prepare($sql); $rs = $stmt->execute($params); $models = []; if ($rs) { // 直接获取出所有符合条件的 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { if (!empty($row)) { $model = new static(); foreach ($row as $rowKey => $rowValue) { $model->$rowKey = $rowValue; } array_push($models, $model); } } } return null; }
你会发现有findOne和findAll方法很相似,明显可以将公共的部分抽出来,然后我们就多了如下两个方法:
/** * Build a sql where part * @param mixed $condition a set of column values * @return string */ public static function buildWhere($condition, $params = null) { if (is_null($params)) { $params = []; } $where = ''; if (!empty($condition)) { $where .= ' where '; $keys = []; foreach ($condition as $key => $value) { array_push($keys, "$key = ?"); array_push($params, $value); } $where .= implode(' and ', $keys); } return [$where, $params]; } /** * Convert array to model * @param mixed $row the row data from database */ public static function arr2Model($row) { $model = new static(); foreach ($row as $rowKey => $rowValue) { $model->$rowKey = $rowValue; } return $model; }
分别是构建sql中where部分的方法和将查找到的Array转换成Model的方法。大家会奇怪第一个方法中为什么需要params参数和返回值,其实这个为了之后的updateAll方法的使用。其实这个地方跟适合使用引用传值。
这样我们的findOne和findAll就便成了如下内容:
/** * Returns a single model instance by a primary key or an array of column values. * * ```php * // find the first customer whose age is 30 and whose status is 1 * $customer = Customer::findOne(['age' => 30, 'status' => 1]); * ``` * * @param mixed $condition a set of column values * @return static|null Model instance matching the condition, or null if nothing matches. */ public static function findOne($condition = null) { list($where, $params) = static::buildWhere($condition); $sql = 'select * from ' . static::tableName() . $where; $stmt = static::getDb()->prepare($sql); $rs = $stmt->execute($params); if ($rs) { $row = $stmt->fetch(PDO::FETCH_ASSOC); if (!empty($row)) { return static::arr2Model($row); } } return null; } /** * Returns a list of models that match the specified primary key value(s) or a set of column values. * * ```php * // find customers whose age is 30 and whose status is 1 * $customers = Customer::findAll(['age' => 30, 'status' => 1]); * ``` * * @param mixed $condition a set of column values * @return array an array of Model instance, or an empty array if nothing matches. */ public static function findAll($condition = null) { list($where, $params) = static::buildWhere($condition); $sql = 'select * from ' . static::tableName() . $where; $stmt = static::getDb()->prepare($sql); $rs = $stmt->execute($params); $models = []; if ($rs) { $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { if (!empty($row)) { $model = static::arr2Model($row); array_push($models, $model); } } } return $models; }
剩下的updateAll/deleteAll/insert/update和delete方法就不一一详细说明了,直接给出代码。其基本思想都是一致的,都是按照规则拼接SQL语句。
/** * Updates models using the provided attribute values and conditions. * For example, to change the status to be 2 for all customers whose status is 1: * * ~~~ * Customer::updateAll(['status' => 1], ['status' => '2']); * ~~~ * * @param array $attributes attribute values (name-value pairs) to be saved for the model. * @param array $condition the condition that matches the models that should get updated. * An empty condition will match all models. * @return integer the number of rows updated */ public static function updateAll($condition, $attributes) { $sql = 'update ' . static::tableName(); $params = []; if (!empty($attributes)) { $sql .= ' set '; $params = array_values($attributes); $keys = []; foreach ($attributes as $key => $value) { array_push($keys, "$key = ?"); } $sql .= implode(' , ', $keys); } list($where, $params) = static::buildWhere($condition, $params); $sql .= $where; $stmt = static::getDb()->prepare($sql); $execResult = $stmt->execute($params); if ($execResult) { // 获取更新的行数 $execResult = $stmt->rowCount(); } return $execResult; } /** * Deletes models using the provided conditions. * WARNING: If you do not specify any condition, this method will delete ALL rows in the table. * * For example, to delete all customers whose status is 3: * * ~~~ * Customer::deleteAll([status = 3]); * ~~~ * * @param array $condition the condition that matches the models that should get deleted. * An empty condition will match all models. * @return integer the number of rows deleted */ public static function deleteAll($condition) { list($where, $params) = static::buildWhere($condition); $sql = 'delete from ' . static::tableName() . $where; $stmt = static::getDb()->prepare($sql); $execResult = $stmt->execute($params); if ($execResult) { // 获取删除的行数 $execResult = $stmt->rowCount(); } return $execResult; } /** * Inserts the model into the database using the attribute values of this record. * * Usage example: * * ```php * $customer = new Customer; * $customer->name = $name; * $customer->email = $email; * $customer->insert(); * ``` * * @return boolean whether the model is inserted successfully. */ public function insert() { $sql = 'insert into ' . static::tableName(); $params = []; $keys = []; foreach ($this as $key => $value) { array_push($keys, $key); array_push($params, $value); } // 构建由?组成的数组,其个数与参数相等数相同 $holders = array_fill(0, count($keys), '?'); $sql .= ' (' . implode(' , ', $keys) . ') values ( ' . implode(' , ', $holders) . ')'; $stmt = static::getDb()->prepare($sql); $execResult = $stmt->execute($params); // 将一些自增值赋回Model中 $primaryKeys = static::primaryKey(); foreach ($primaryKeys as $name) { // Get the primary key $lastId = static::getDb()->lastInsertId($name); $this->$name = (int) $lastId; } return $execResult; } /** * Saves the changes to this model into the database. * * Usage example: * * ```php * $customer = Customer::findOne(['id' => $id]); * $customer->name = $name; * $customer->email = $email; * $customer->update(); * ``` * * @return integer|boolean the number of rows affected. * Note that it is possible that the number of rows affected is 0, even though the * update execution is successful. */ public function update() { $primaryKeys = static::primaryKey(); $condition = []; foreach ($primaryKeys as $name) { $condition[$name] = isset($this->$name) ? $this->$name : null; } $attributes = []; foreach ($this as $key => $value) { if (!in_array($key, $primaryKeys, true)) { $attributes[$key] = $value; } } return static::updateAll($condition, $attributes) !== false; } /** * Deletes the model from the database. * * @return integer|boolean the number of rows deleted. * Note that it is possible that the number of rows deleted is 0, even though the deletion execution is successful. */ public function delete() { $primaryKeys = static::primaryKey(); $condition = []; foreach ($primaryKeys as $name) { $condition[$name] = isset($this->$name) ? $this->$name : null; } return static::deleteAll($condition) !== false; }
这样基本的Model就算是暂时完成了,虽然可能还有很多问题和局限,但暂时先这样了,我们之后有机会会一步一步的去完善。
好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。
code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.7
blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Les longues URL, souvent encombrées de mots clés et de paramètres de suivi, peuvent dissuader les visiteurs. Un script de raccourcissement d'URL offre une solution, créant des liens concis idéaux pour les médias sociaux et d'autres plateformes. Ces scripts sont utiles pour les sites Web individuels

À la suite de son acquisition de haut niveau par Facebook en 2012, Instagram a adopté deux ensembles d'API pour une utilisation tierce. Ce sont l'API graphique Instagram et l'API d'affichage de base Instagram. En tant que développeur créant une application qui nécessite des informations à partir d'un

Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

Il s'agit de la deuxième et dernière partie de la série sur la construction d'une application React avec un back-end Laravel. Dans la première partie de la série, nous avons créé une API RESTful utilisant Laravel pour une application de liste de base sur le produit. Dans ce tutoriel, nous serons Dev

Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

L'enquête sur le paysage PHP 2025 étudie les tendances actuelles de développement du PHP. Il explore l'utilisation du cadre, les méthodes de déploiement et les défis, visant à fournir des informations aux développeurs et aux entreprises. L'enquête prévoit la croissance de la PHP moderne versio
