Wie verbinde ich yii mit der Datenbank?
Detailliertes Verständnis der Yii2.0-Verbindungsdatenbank
Yii verwendet PDO (PHP Date Object), um eine Verbindung zu verschiedenen Datenbanken herzustellen, daher fast alle Mainstream-Datenbanken Yii kann für jede Datenbank gute Unterstützung bieten. Dies ist auch die breite Anwendbarkeit, die ein ausgereiftes Framework haben sollte.
Empfohlenes Lernen: yii-Framework
Bevor Sie irgendwelche Vorgänge an der Datenbank ausführen, müssen Sie zunächst eine Verbindung mit dem Datenbankserver herstellen. In der Yii-Anwendung gibt es eine dedizierte Kernkomponente für die Handhabung von Datenbankverbindungen. Wir können sie leicht in der Konfigurationsdatei finden:
'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2advanced', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ], // ... ... ], // ... ...
Hier muss jemand vermutet haben, dass Yii yiidbConnection verwendet, um die Datenbankverbindung darzustellen. Diese Verbindung implementiert eine einfache Kapselung von PDO, maskiert die Unterschiede zwischen verschiedenen Datenbanken und implementiert eine einheitliche Entwicklungsschnittstelle. Auf diese Weise können Sie die meisten Datenbankkompatibilitätsprobleme während des Programmierprozesses ignorieren und sich mehr auf die funktionale Entwicklung konzentrieren. Sie müssen sich beispielsweise keine Sorgen mehr machen, dass Sie Felder vom Typ „Money“ unter MySQL usw. nicht verwenden können.
Datenbankschema
Wenn es darum geht, Connection von verschiedenen Datenbanken unabhängig zu machen, müssen wir das Datenbankschema erwähnen. Yii bietet verschiedene gängige Datenbankschemata, und Sie können sogar Ihr eigenes Schema schreiben, das zu Ihrem eigenen einzigartigen Datenbankverwaltungssystem (DBMS) passt. Es gibt mehrere Klassen, die sich auf Schema beziehen:
Abstrakte Klasse yiidbSchema, die zur Beschreibung des Schemas verschiedener DBMS verwendet wird.
yiidbTableSchema wird verwendet, um die Tabellenstruktur zu beschreiben.
yiidbColumnSchema wird zur Beschreibung von Feldinformationen verwendet.
Verschiedene Schemata unter yiidbpgsql, yiidbmysql, yiidbsqlite, yiidbmssql, yiidboci, yiidbcubird werden zur detaillierten Beschreibung verschiedener DBMS verwendet.
In yiidbConnection gibt es ein $schemaMap-Array, das verwendet wird, um die Zuordnungsbeziehung zwischen dem PDO-Datenbanktreiber und der spezifischen Schemaklasse herzustellen:
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 ];
Wir können davon ausgehen, dass Yii das oben Genannte unterstützt Das Array umfasst standardmäßig 10 Arten von DBMS (6 Schemas), was in den meisten Fällen völlig ausreichend ist. Falls Sie ein DBMS außerhalb dieses Bereichs verwenden, können Sie selbst ein Schema schreiben, damit Yii das DBMS unterstützen und gleichzeitig die Kompatibilität gewährleisten kann.
Schema-Basisklasse
yiidbSchema ist eine abstrakte Klasse und die spezifische Implementierung basiert auf 6 Unterklassen von Schema für verschiedene DBMS. Um zuerst den Dieb zu fangen, lesen Sie zuerst die Basisklasse:
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 Typen, die die offensichtlichsten Unterschiede zwischen DBMS und Bereitstellung aufweisen. Es gibt 16 grundlegende Feldtypen. Diese 16 Typen haben nichts mit DBMS zu tun. Wenn es um ein bestimmtes DBMS geht, konvertiert Yii es automatisch in den entsprechenden Datenbankfeldtyp. Wenn wir in der Programmierung Feldtypen angeben müssen, verwenden wir diese 16 Typen. In diesem Fall muss nicht berücksichtigt werden, ob das konkret verwendete DBMS dies unterstützt.
Was diese 16 Typen bedeuten, wissen Sie schon beim bloßen Betrachten, deshalb gehen wir nicht ins Detail.
yiidbSchema::loadTableSchema() ist die wichtigste Anweisung in der gesamten Basisklasse. Sie definiert eine Funktion zum Laden des Schemas der Tabelle, die von einer Unterklasse für ein bestimmtes DBMS implementiert werden muss. Hier nehmen wir zur Erläuterung die Unterklasse yiidbmysqlSchema:
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 definiert zunächst eine Zuordnungsbeziehung. Diese Zuordnungsbeziehung ist die Zuordnungsbeziehung zwischen den Feldtypen der MySQL-Datenbank und den 16 grundlegenden Datentypen, die wir erwähnt haben früher. . Mit anderen Worten: Basierend auf dem MySQL-Schema werden mithilfe von MySQL Feldtypen in einheitliche 16 Basisdatentypen konvertiert.
Tabelleninformationen (Tabellenschema)
Die yiidbTableSchema-Klasse wird verwendet, um die Informationen der Datentabelle zu beschreiben:
class TableSchema extends Object { public $schemaName; // 所属的Schema public $name; // 表名,不包含Schema部分 public $fullName; // 表的完整名称,可能包含一个Schema前缀。 public $primaryKey = []; // 主键 public $sequenceName; // 主键若使用sequence,该属性表示序列名 public $foreignKeys = []; // 外键 public $columns = []; // 字段 // ... ... }
Aus dem obigen Code: yiidbTableSchema-Vergleich Einfach. Anhand der oben genannten Attribute können Sie grob nachvollziehen, wofür sie verwendet werden. Klicken wir hier ein wenig, um es zu verstehen.
Spalteninformationen (Spaltenschema)
Die Klasse yiidbColumnSchema wird verwendet, um die Informationen eines Feldes zu beschreiben. Werfen wir einen Blick darauf:
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); } }
Das obige ist der detaillierte Inhalt vonSo stellen Sie eine Verbindung zur Datenbank in yii her. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!