ホームページ  >  記事  >  PHPフレームワーク  >  yii でデータベースに接続する方法

yii でデータベースに接続する方法

藏色散人
藏色散人オリジナル
2020-01-09 10:34:162483ブラウズ

yii でデータベースに接続する方法

yii はどのようにしてデータベースに接続しますか?

Yii2.0 でのデータベースへの接続についての深い理解

Yii は PDO (PHP Date Object) を使用してさまざまなデータベースに接続します。したがって、ほとんどすべての主流 Yii は、あらゆるデータベースに対して優れたサポートを提供できます。これは、成熟したフレームワークが持つべき幅広い適用性でもあります。

推奨学習: yii フレームワーク

データベースで操作を実行する前に、データベース サーバーとの接続を確立する必要があります。 Yii アプリケーションには、データベース接続を処理するための専用のコアコンポーネントがあり、設定ファイルで簡単に見つけることができます:

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

誰かがここで推測したはずですが、Yii は yii\db \Connection を使用してデータベースを表します繋がり。この接続は、PDO の単純なカプセル化を実装し、さまざまなデータベース間の違いをマスクし、統合された開発インターフェイスを実装します。こうすることで、プログラミング プロセス中にデータベースの互換性の問題のほとんどを無視して、機能開発に重点を置くことができます。たとえば、MySQL などで Money 型フィールドが使用できないことを心配する必要はなくなります。

データベース スキーマ

Connection がさまざまなデータベースから独立していることを理解するには、データベース スキーマについて言及する必要があります。 Yii はさまざまな主流のデータベーススキーマを提供しており、独自のデータベース管理システム (DBMS) に合わせて独自のスキーマを作成することもできます。スキーマに関連するクラスがいくつかあります。

yii\db\Schema 抽象クラス。さまざまな DBMS のスキーマを記述するために使用されます。

yii\db\TableSchema は、テーブル構造を記述するために使用されます。

yii\db\ColumnSchema は、フィールド情報を記述するために使用されます。

yii\db\pgsql、yii\db\mysql、yii\db\sqlite、yii\db\mssql、yii\db\oci、yii\db\cubird のさまざまなスキーマ、特定のさまざまな DBMS について説明。

yii\db\Connection には、PDO データベース ドライバーと特定のスキーマ クラス間のマッピング関係を確立するために使用される $schemaMap 配列があります。

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 スキーマ) をサポートしますが、ほとんどの場合、これで十分です。この範囲を超えて DBMS を使用する場合は、Yii が互換性を確保しながら DBMS をサポートできるように、スキーマを自分で記述することができます。

スキーマ基本クラス

yii\db\Schema は抽象クラスであり、具体的な実装はさまざまな DBMS のスキーマの 6 つのサブクラスに依存します。まず泥棒を捕まえるには、まず王を捕まえてください。コードを読むときは、最初に基本クラスを読んでください。最初にこの 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() は、基本クラス全体で最も重要なステートメントです。テーブルのスキーマをロードする関数を定義します。この関数は、特定のサブクラスによって実装される必要があります。 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 個の基本データ型に変換されます。

テーブル情報 (テーブル スキーマ)

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 は比較的単純です。上記の属性を見れば、何に使われるかが大体わかります。それを理解するために、ここで少しクリックしてみましょう。

列情報 (列スキーマ)

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 でデータベースに接続する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。