yii怎么連數據庫

yii怎么連數據庫

yii怎么連數據庫?

深入理解Yii2.0之連接數據庫

Yii使用PDO(PHP Date Object)連接各種各樣的數據庫,因此,幾乎所有主流的數據庫,Yii都可以 很好地提供支持。這也是一個成熟框架所應具有的廣泛適用性。

推薦學習:yii框架

在對數據庫進行任何操作之前,都必須先與數據庫服務器建立連接。在Yii應用中,有一個專門的核心 組件(component)用于處理數據庫連接,我們很容易可以在配置文件中找到他:

'components'?=>?[ ????'db'?=>?[ ????????'class'?=>?'yiidbConnection', ????????'dsn'?=>?'mysql:host=localhost;dbname=yii2advanced', ????????'username'?=>?'root', ????????'password'?=>?'', ????????'charset'?=>?'utf8', ????], ????//?...?... ], //?...?...

這里有人肯定已經猜到了,Yii用 yiidbConnection 來表示數據庫連接。這個Connection實現了 對于PDO的一個簡單封裝,并掩蓋了各種數據庫的區別,實現了一個統一的開發接口。這樣,使得你在 編程過程中,可以忽略絕大多數的數據庫兼容問題,可以更加專注于功能開發。比如,你不用再擔心在 MySQL下不能使用Money類型的字段等等。

數據庫Schema

說到實現Connection獨立于各種數據庫,就不得不提到數據庫Schema。Yii提供了各種主流的數據庫 Schema,你甚至可以自己寫一個Schema以適用自己獨特的數據庫管理系統(DBMS)。與Schema有關的類 有這么幾個:

yiidbSchema 抽象類,用于描述各種不同的DBMS的Schema。

yiidbTableSchema 用于描述表結構。

yiidbColumnSchema 用于描述字段信息。

yiidbpgsql, yiidbmysql, yiidbsqlite, yiidbmssql, yiidboci, yiidbcubird 下的各種schema,用于具體描述各種DBMS。

在 yiidbConnection 中,有一個 $schemaMap 數組,用于建立PDO數據庫驅動與具體的 schema 類間的映射關系:

public?$schemaMap?=?[ ????'pgsql'?=>?'yiidbpgsqlSchema',?//?PostgreSQL ????'mysqli'?=>?'yiidbmysqlSchema',?//?MySQL ????'mysql'?=>?'yiidbmysqlSchema',?//?MySQL ????'sqlite'?=>?'yiidbsqliteSchema',?//?sqlite?3 ????'sqlite2'?=>?'yiidbsqliteSchema',?//?sqlite?2 ????'sqlsrv'?=>?'yiidbmssqlSchema',?//?newer?MSSQL?driver?on?MS?Windows?hosts ????'oci'?=>?'yiidbociSchema',?//?Oracle?driver ????'mssql'?=>?'yiidbmssqlSchema',?//?older?MSSQL?driver?on?MS?Windows?hosts ????'dblib'?=>?'yiidbmssqlSchema',?//?dblib?drivers?on?GNU/Linux?(and?maybe?other?OSes)?hosts ????'cubrid'?=>?'yiidbcubridSchema',?//?CUBRID ];

我們可以認為Yii默認情況下支持上述數組中的10種DBMS(6個Schema),這在絕大多數情況下, 是完全足夠的。萬一你使用了超出這一范圍的DBMS,在確保兼容的情況下,你可以自己寫一個Schema, 使Yii可以支持該DBMS。

Schema基類

yiidbSchema 是一個抽象類,具體的實現依賴于針對不同DBMS的6個子類Schema。擒賊先擒王, 讀代碼先讀基類,我們就先來看看這個 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 一上來就先針對各DBMS間差異最明顯的字段數據類型進行統一,提供了16種基本的 字段類型。這16種類型與DBMS無關,在具體到特定的DBMS時,Yii會自動轉換成合適的數據庫字段類型 。我們在編程中,若需要指定字段類型,就使用這16種。這樣的話,就不用考慮使用的類型具體的DBMS 是否支持的問題了。

這16種類型看著就知道是什么意思,我們就不展開講了。

yiidbSchema::loadTableSchema() 是整個基類中最重要的一語句了,他定義了一個函數,用于 加載表的schema,需要由子類針對特定的DBMS實現。這里,我們以 yiidbmysqlSchema 子類為 例來講解:

class?Schema?extends?yiidbSchema { ????//?定義一個數據類型的映射關系 ????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 先是定義了一個映射關系,這個映射關系是MySQL數據庫的字段類型與前面 我們提到的16種基本數據類型的映射關系。也就是說,基于MySQL的Schema,使用MySQL的字段類型,會 轉換成統一的16種基本數據類型。

表信息(Table Schema)

yiidbTableSchema 類用于描述數據表的信息:

class?TableSchema?extends?Object { ????public?$schemaName;?????????????//?所屬的Schema ????public?$name;???????????????????//?表名,不包含Schema部分 ????public?$fullName;???????????????//?表的完整名稱,可能包含一個Schema前綴。 ????public?$primaryKey?=?[];????????//?主鍵 ????public?$sequenceName;???????????//?主鍵若使用sequence,該屬性表示序列名 ????public?$foreignKeys?=?[];???????//?外鍵 ????public?$columns?=?[];???????????//?字段 ????//?...?... }

從上面的代碼來看, yiidbTableSchema 比較簡單。上述的屬性看一看就大致可以了解是干什么 用的。這里我們點一點,了解下就可以了。

列信息(Column Schema)

yiidbColumnSchema 類用于描述一個字段的信息,讓我們來看一看:

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); ????} }

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享