您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)yii連數(shù)據(jù)庫的方法的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
yii怎么連數(shù)據(jù)庫?
深入理解Yii2.0之連接數(shù)據(jù)庫
Yii使用PDO(PHP Date Object)連接各種各樣的數(shù)據(jù)庫,因此,幾乎所有主流的數(shù)據(jù)庫,Yii都可以 很好地提供支持。這也是一個成熟框架所應(yīng)具有的廣泛適用性。
推薦學(xué)習(xí):yii框架
在對數(shù)據(jù)庫進行任何操作之前,都必須先與數(shù)據(jù)庫服務(wù)器建立連接。在Yii應(yīng)用中,有一個專門的核心 組件(component)用于處理數(shù)據(jù)庫連接,我們很容易可以在配置文件中找到他:
'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2advanced', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ], // ... ... ], // ... ...
這里有人肯定已經(jīng)猜到了,Yii用 yii\db\Connection 來表示數(shù)據(jù)庫連接。這個Connection實現(xiàn)了 對于PDO的一個簡單封裝,并掩蓋了各種數(shù)據(jù)庫的區(qū)別,實現(xiàn)了一個統(tǒng)一的開發(fā)接口。這樣,使得你在 編程過程中,可以忽略絕大多數(shù)的數(shù)據(jù)庫兼容問題,可以更加專注于功能開發(fā)。比如,你不用再擔(dān)心在 MySQL下不能使用Money類型的字段等等。
數(shù)據(jù)庫Schema
說到實現(xiàn)Connection獨立于各種數(shù)據(jù)庫,就不得不提到數(shù)據(jù)庫Schema。Yii提供了各種主流的數(shù)據(jù)庫 Schema,你甚至可以自己寫一個Schema以適用自己獨特的數(shù)據(jù)庫管理系統(tǒng)(DBMS)。與Schema有關(guān)的類 有這么幾個:
yii\db\Schema 抽象類,用于描述各種不同的DBMS的Schema。
yii\db\TableSchema 用于描述表結(jié)構(gòu)。
yii\db\ColumnSchema 用于描述字段信息。
yii\db\pgsql, yii\db\mysql, yii\db\sqlite, yii\db\mssql, yii\db\oci, yii\db\cubird 下的各種schema,用于具體描述各種DBMS。
在 yii\db\Connection 中,有一個 $schemaMap 數(shù)組,用于建立PDO數(shù)據(jù)庫驅(qū)動與具體的 schema 類間的映射關(guān)系:
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 ];
我們可以認(rèn)為Yii默認(rèn)情況下支持上述數(shù)組中的10種DBMS(6個Schema),這在絕大多數(shù)情況下, 是完全足夠的。萬一你使用了超出這一范圍的DBMS,在確保兼容的情況下,你可以自己寫一個Schema, 使Yii可以支持該DBMS。
Schema基類
yii\db\Schema 是一個抽象類,具體的實現(xiàn)依賴于針對不同DBMS的6個子類Schema。擒賊先擒王, 讀代碼先讀基類,我們就先來看看這個 yii\db\Schema 吧:
abstract class Schema extends Object { // 預(yù)定義16種基本字段類型,這16種類型是與DBMS無關(guān)的,具體到特定的DBMS時,Yii會自動 // 轉(zhuǎn)換成合適的數(shù)據(jù)庫字段類型。 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,需要子類具體實現(xiàn) abstract protected function loadTableSchema($name); // ... ... }
yii\db\Schema 一上來就先針對各DBMS間差異最明顯的字段數(shù)據(jù)類型進行統(tǒng)一,提供了16種基本的 字段類型。這16種類型與DBMS無關(guān),在具體到特定的DBMS時,Yii會自動轉(zhuǎn)換成合適的數(shù)據(jù)庫字段類型 。我們在編程中,若需要指定字段類型,就使用這16種。這樣的話,就不用考慮使用的類型具體的DBMS 是否支持的問題了。
這16種類型看著就知道是什么意思,我們就不展開講了。
yii\db\Schema::loadTableSchema() 是整個基類中最重要的一語句了,他定義了一個函數(shù),用于 加載表的schema,需要由子類針對特定的DBMS實現(xiàn)。這里,我們以 yii\db\mysql\Schema 子類為 例來講解:
class Schema extends \yii\db\Schema { // 定義一個數(shù)據(jù)類型的映射關(guān)系 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, ]; }
yii\db\mysql\Schema 先是定義了一個映射關(guān)系,這個映射關(guān)系是MySQL數(shù)據(jù)庫的字段類型與前面 我們提到的16種基本數(shù)據(jù)類型的映射關(guān)系。也就是說,基于MySQL的Schema,使用MySQL的字段類型,會 轉(zhuǎn)換成統(tǒng)一的16種基本數(shù)據(jù)類型。
表信息(Table Schema)
yii\db\TableSchema 類用于描述數(shù)據(jù)表的信息:
class TableSchema extends Object { public $schemaName; // 所屬的Schema public $name; // 表名,不包含Schema部分 public $fullName; // 表的完整名稱,可能包含一個Schema前綴。 public $primaryKey = []; // 主鍵 public $sequenceName; // 主鍵若使用sequence,該屬性表示序列名 public $foreignKeys = []; // 外鍵 public $columns = []; // 字段 // ... ... }
從上面的代碼來看, yii\db\TableSchema 比較簡單。上述的屬性看一看就大致可以了解是干什么 用的。這里我們點一點,了解下就可以了。
列信息(Column Schema)
yii\db\ColumnSchema 類用于描述一個字段的信息,讓我們來看一看:
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; // 字段類型對應(yīng)的PHP數(shù)據(jù)類型 /** * @var string the DB type of this column. Possible DB types vary according to the type of DBMS. */ public $dbType; public $defaultValue; // 字段默認(rèn)值 public $enumValues; // 若字段為枚舉類型,該屬性用于表示可供枚舉的值 /** * @var integer display size of the column. */ public $size; public $precision; // 若字段為數(shù)值,該屬性用于表示精度 /** * @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); } }
感謝各位的閱讀!關(guān)于“yii連數(shù)據(jù)庫的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。