Comment connecter yii à la base de données ?
Compréhension approfondie de la base de données de connexion Yii2.0
Yii utilise PDO (PHP Date Object) pour se connecter à diverses bases de données, donc presque toutes les bases de données grand public Yii peut fournir un bon support pour n'importe quelle base de données. C’est également la large applicabilité que devrait avoir un cadre mature.
Apprentissage recommandé : framework yii
Avant d'effectuer toute opération sur la base de données, vous devez d'abord établir une connexion avec le serveur de base de données. Dans l'application Yii, il existe un composant principal dédié à la gestion des connexions à la base de données. Nous pouvons facilement le trouver dans le fichier de configuration :
'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2advanced', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ], // ... ... ], // ... ...
Quelqu'un a dû deviner ici que Yii utilise yiidbConnection pour la représenter. Cette connexion implémente une simple encapsulation de PDO, masque les différences entre les différentes bases de données et implémente une interface de développement unifiée. De cette façon, vous pouvez ignorer la plupart des problèmes de compatibilité des bases de données pendant le processus de programmation et vous concentrer davantage sur le développement fonctionnel. Par exemple, vous n'avez plus à vous soucier de ne pas pouvoir utiliser les champs de type Money sous MySQL, etc.
Schéma de base de données
Quand il s'agit de rendre Connection indépendante de diverses bases de données, nous devons mentionner le schéma de base de données. Yii fournit divers schémas de base de données grand public, et vous pouvez même écrire votre propre schéma en fonction de votre propre système de gestion de base de données (SGBD). Il existe plusieurs classes liées au Schema :
classe abstraite yiidbSchema, utilisée pour décrire le schéma de divers SGBD.
yiidbTableSchema est utilisé pour décrire la structure de la table.
yiidbColumnSchema est utilisé pour décrire les informations de champ.
Divers schémas sous yiidbpgsql, yiidbmysql, yiidbsqlite, yiidbmssql, yiidboci, yiidbcubird, utilisés pour décrire en détail divers SGBD.
Dans yiidbConnection, il existe un tableau $schemaMap, qui est utilisé pour établir la relation de mappage entre le pilote de base de données PDO et la classe de schéma spécifique :
public $schemaMap = [ 'pgsql' => 'yii\db\pgsql\Schema', // PostgreSQL 'mysqli' => 'yii\db\mysql\Schema', // MySQL 'mysql' => 'yii\db\mysql\Schema', // MySQL 'sqlite' => 'yii\db\sqlite\Schema', // sqlite 3 'sqlite2' => 'yii\db\sqlite\Schema', // sqlite 2 'sqlsrv' => 'yii\db\mssql\Schema', // newer MSSQL driver on MS Windows hosts 'oci' => 'yii\db\oci\Schema', // Oracle driver 'mssql' => 'yii\db\mssql\Schema', // older MSSQL driver on MS Windows hosts 'dblib' => 'yii\db\mssql\Schema', // dblib drivers on GNU/Linux (and maybe other OSes) hosts 'cubrid' => 'yii\db\cubrid\Schema', // CUBRID ];
Nous pouvons penser que Yii prend en charge ce qui précède tableau par défaut 10 types de SGBD (6 schémas), ce qui est tout à fait suffisant dans la plupart des cas. Si vous utilisez un SGBD au-delà de cette plage, vous pouvez écrire vous-même un schéma afin que Yii puisse prendre en charge le SGBD tout en garantissant la compatibilité.
Classe de base de schéma
yiidbSchema est une classe abstraite, et l'implémentation spécifique repose sur 6 sous-classes de Schema pour différents SGBD. Pour attraper le voleur en premier, attrapez d'abord le roi. Lors de la lecture du code, lisez d'abord la classe de base. Jetons d'abord un coup d'œil à ce yiidbSchema :
abstract class Schema extends Object { // 预定义16种基本字段类型,这16种类型是与DBMS无关的,具体到特定的DBMS时,Yii会自动 // 转换成合适的数据库字段类型。 const TYPE_PK = 'pk'; const TYPE_BIGPK = 'bigpk'; const TYPE_STRING = 'string'; const TYPE_TEXT = 'text'; const TYPE_SMALLINT = 'smallint'; const TYPE_INTEGER = 'integer'; const TYPE_BIGINT = 'bigint'; const TYPE_FLOAT = 'float'; const TYPE_DECIMAL = 'decimal'; const TYPE_DATETIME = 'datetime'; const TYPE_TIMESTAMP = 'timestamp'; const TYPE_TIME = 'time'; const TYPE_DATE = 'date'; const TYPE_BINARY = 'binary'; const TYPE_BOOLEAN = 'boolean'; const TYPE_MONEY = 'money'; // 加载表schema,需要子类具体实现 abstract protected function loadTableSchema($name); // ... ... }
yiidbSchema. types avec les différences les plus évidentes entre les SGBD et provide. Il existe 16 types de champs de base. Ces 16 types n'ont rien à voir avec le SGBD. Lorsqu'il s'agit d'un SGBD spécifique, Yii le convertira automatiquement dans le type de champ de base de données approprié. En programmation, si nous devons spécifier des types de champs, nous utilisons ces 16 types. Dans ce cas, il n’est pas nécessaire de déterminer si le SGBD spécifique utilisé le prend en charge.
Vous saurez ce que signifient ces 16 types rien qu’en les regardant, nous n’entrerons donc pas dans les détails.
yiidbSchema::loadTableSchema() est l'instruction la plus importante de toute la classe de base. Elle définit une fonction de chargement du schéma de la table, qui doit être implémentée par une sous-classe pour un SGBD spécifique. Ici, nous prenons la sous-classe yiidbmysqlSchema comme exemple pour expliquer :
class Schema extends \yii\db\Schema { // 定义一个数据类型的映射关系 public $typeMap = [ 'tinyint' => self::TYPE_SMALLINT, 'bit' => self::TYPE_INTEGER, 'smallint' => self::TYPE_SMALLINT, 'mediumint' => self::TYPE_INTEGER, 'int' => self::TYPE_INTEGER, 'integer' => self::TYPE_INTEGER, 'bigint' => self::TYPE_BIGINT, 'float' => self::TYPE_FLOAT, 'double' => self::TYPE_FLOAT, 'real' => self::TYPE_FLOAT, 'decimal' => self::TYPE_DECIMAL, 'numeric' => self::TYPE_DECIMAL, 'tinytext' => self::TYPE_TEXT, 'mediumtext' => self::TYPE_TEXT, 'longtext' => self::TYPE_TEXT, 'longblob' => self::TYPE_BINARY, 'blob' => self::TYPE_BINARY, 'text' => self::TYPE_TEXT, 'varchar' => self::TYPE_STRING, 'string' => self::TYPE_STRING, 'char' => self::TYPE_STRING, 'datetime' => self::TYPE_DATETIME, 'year' => self::TYPE_DATE, 'date' => self::TYPE_DATE, 'time' => self::TYPE_TIME, 'timestamp' => self::TYPE_TIMESTAMP, 'enum' => self::TYPE_STRING, ]; }
yiidbmysqlSchema définit d'abord une relation de mappage. Cette relation de mappage est la relation de mappage entre les types de champs de la base de données MySQL et les 16 types de données de base que nous avons mentionnés. plus tôt. . En d'autres termes, basé sur le schéma MySQL, utilisant les types de champs MySQL, il sera converti en 16 types de données de base unifiés.
Informations sur la table (Schéma de table)
La classe yiidbTableSchema est utilisée pour décrire les informations de la table de données :
class TableSchema extends Object { public $schemaName; // 所属的Schema public $name; // 表名,不包含Schema部分 public $fullName; // 表的完整名称,可能包含一个Schema前缀。 public $primaryKey = []; // 主键 public $sequenceName; // 主键若使用sequence,该属性表示序列名 public $foreignKeys = []; // 外键 public $columns = []; // 字段 // ... ... }
À partir du code ci-dessus, yiidbTableSchema compare Simple. Vous pouvez comprendre à peu près à quoi ils servent en jetant un œil aux attributs ci-dessus. Cliquons un peu ici pour le comprendre.
Informations sur la colonne (Column Schema)
La classe yiidbColumnSchema est utilisée pour décrire les informations d'un champ, jetons un coup d'oeil :
class ColumnSchema extends Object { public $name; // 字段名 public $allowNull; // 是否可以为NULL /** * @var string abstract type of this column. Possible abstract types include: * string, text, boolean, smallint, integer, bigint, float, decimal, datetime, * timestamp, time, date, binary, and money. */ public $type; // 字段的类型 /** * @var string the PHP type of this column. Possible PHP types include: * `string`, `boolean`, `integer`, `double`. */ public $phpType; // 字段类型对应的PHP数据类型 /** * @var string the DB type of this column. Possible DB types vary according to the type of DBMS. */ public $dbType; public $defaultValue; // 字段默认值 public $enumValues; // 若字段为枚举类型,该属性用于表示可供枚举的值 /** * @var integer display size of the column. */ public $size; public $precision; // 若字段为数值,该属性用于表示精度 /** * @var integer scale of the column data, if it is numeric. */ public $scale; /** * @var boolean whether this column is a primary key */ public $isPrimaryKey; // 是否是主键 public $autoIncrement = false; // 是否是自增长字段 /** * @var boolean whether this column is unsigned. This is only meaningful * when [[type]] is `smallint`, `integer` or `bigint`. */ public $unsigned; // 是否是unsigned,仅对支持的类型有效 public $comment; // 字段描述信息 /** * Converts the input value according to [[phpType]] after retrieval from the database. * If the value is null or an [[Expression]], it will not be converted. * @param mixed $value input value * @return mixed converted value */ public function phpTypecast($value) { if ($value === '' && $this->type !== Schema::TYPE_TEXT && $this->type !== Schema::TYPE_STRING && $this->type !== Schema::TYPE_BINARY) { return null; } if ($value === null || gettype($value) === $this->phpType || $value instanceof Expression) { return $value; } switch ($this->phpType) { case 'resource': case 'string': return is_resource($value) ? $value : (string) $value; case 'integer': return (int) $value; case 'boolean': return (bool) $value; case 'double': return (double) $value; } return $value; } /** * Converts the input value according to [[type]] and [[dbType]] for use in a db query. * If the value is null or an [[Expression]], it will not be converted. * @param mixed $value input value * @return mixed converted value. This may also be an array containing the value as the first element * and the PDO type as the second element. */ public function dbTypecast($value) { // the default implementation does the same as casting for PHP but it should be possible // to override this with annotation of explicit PDO type. return $this->phpTypecast($value); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!