91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

yii連數據庫的方法

發布時間:2021-01-06 11:50:29 來源:億速云 閱讀:320 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關yii連數據庫的方法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

yii怎么連數據庫?

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

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

推薦學習:yii框架

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

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

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

數據庫Schema

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

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

yii\db\TableSchema 用于描述表結構。

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 數組,用于建立PDO數據庫驅動與具體的 schema 類間的映射關系:

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
];

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

Schema基類

yii\db\Schema 是一個抽象類,具體的實現依賴于針對不同DBMS的6個子類Schema。擒賊先擒王, 讀代碼先讀基類,我們就先來看看這個 yii\db\Schema 吧:

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);
    // ... ...
}

yii\db\Schema 一上來就先針對各DBMS間差異最明顯的字段數據類型進行統一,提供了16種基本的 字段類型。這16種類型與DBMS無關,在具體到特定的DBMS時,Yii會自動轉換成合適的數據庫字段類型 。我們在編程中,若需要指定字段類型,就使用這16種。這樣的話,就不用考慮使用的類型具體的DBMS 是否支持的問題了。

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

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

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,
    ];
}

yii\db\mysql\Schema 先是定義了一個映射關系,這個映射關系是MySQL數據庫的字段類型與前面 我們提到的16種基本數據類型的映射關系。也就是說,基于MySQL的Schema,使用MySQL的字段類型,會 轉換成統一的16種基本數據類型。

表信息(Table Schema)

yii\db\TableSchema 類用于描述數據表的信息:

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;            // 字段類型對應的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);
    }
}

感謝各位的閱讀!關于“yii連數據庫的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

yii
AI

松滋市| 广宗县| 许昌市| 安阳县| 炉霍县| 四会市| 长乐市| 阜新| 綦江县| 东宁县| 建水县| 曲阜市| 泗洪县| 陆丰市| 大邑县| 准格尔旗| 榕江县| 涿鹿县| 新余市| 鄂州市| 铜梁县| 错那县| 夏河县| 灵武市| 弥勒县| 石首市| 海口市| 柘荣县| 柳林县| 文水县| 鲁甸县| 邓州市| 平定县| 新河县| 自贡市| 宝清县| 临沧市| 泰和县| 松潘县| 响水县| 饶平县|