Phalcon數據庫抽象層

數據庫抽象層(Database Abstraction Layer)

Phalcon\DbPhalcon\Mvc\Model底層組件,由它驅動框架中的模型層。它徹底由C語言編寫,是一個獨立的數據庫高級抽象層。php

與傳統模型相比,該組件容許更底層的數據庫操做。mysql

數據庫適配器(Database Adapters)

該組件使用適配器來封裝特定的數據庫操做。Phalcon使用PDO鏈接數據庫,支持下列數據庫引擎:sql

說明
Phalcon\Db\Adapter\Pdo\Mysql 世界上最流行的關係型數據庫系統(RDBMS),做爲服務器運行,支持多用戶、多數據庫訪問
Phalcon\Db\Adapter\Pdo\Postgresql Postgresql是一個強大的開源關係數據庫系統,超過15年的發展和經過驗證的架構,爲其贏得了正確、可靠、數據完整的良好聲譽
Phalcon\Db\Adapter\Pdo\Sqlite SQLite是一個實現自包含、無服務、零配置的事務型數據庫

工廠類(Factory)

使用適配器選項加載PDO:數據庫

<?php

use Phalcon\Db\Adapter\Pdo\Factory;

$options = [
    'host'     => 'localhost',
    'dbname'   => 'blog',
    'port'     => 3306,
    'username' => 'sigma',
    'password' => 'secret',
    'adapter'  => 'mysql',
];

$db = Factory::load($options);

自定義適配器(Implementing your own adapters)

建立自定義數據庫適配器或擴展示有適配器,必須實現Phalcon\Db\AdapterInterface接口。數組

數據庫語言(Database Dialects)

phalcon語言封裝了每一個數據庫的具體操做,爲適配器提供通用方法和SQL生成器。服務器

說明
Phalcon\Db\Dialect\Mysql MySQL特定語言
Phalcon\Db\Dialect\Postgresql Postgresql特定語言
Phalcon\Db\Dialect\Sqlite SQLite特定語言

自定義語言(Implementing your own dialects)

建立自定義數據庫語言或擴展示有語言,必須實現Phalcon\Db\DialectInterface接口。架構

鏈接數據庫(Connection to Databases)

創建數據庫鏈接,必須實例化適配器類,它只接收一個包含鏈接參數的數組。下面例子展現瞭如何傳遞必選參數和可選參數來創建數據庫鏈接:app

<?php

// 必選參數
$config = [
    'host'     => '127.0.0.1',
    'username' => 'mike',
    'password' => 'sigma',
    'dbname'   => 'test_db',
];

// 可選參數
$config['persistent'] = false;

// 創建鏈接
$connection = new \Phalcon\Db\Adapter\Pdo\Mysql($config);
<?php

// 必選參數
$config = [
    'host'     => 'localhost',
    'username' => 'postgres',
    'password' => 'secret1',
    'dbname'   => 'template',
];

// 可選參數
$config['schema'] = 'public';

// 創建鏈接
$connection = new \Phalcon\Db\Adapter\Pdo\Postgresql($config);

設置額外的PDO選項(Setting up additional PDO options)

在創建鏈接時,傳遞options參數設置PDO:框架

<?php

// 使用PDO選項創建鏈接
$connection = new \Phalcon\Db\Adapter\Pdo\Mysql(
    [
        'host'     => 'localhost',
        'username' => 'root',
        'password' => 'sigma',
        'dbname'   => 'test_db',
        'options'  => [
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
            PDO::ATTR_CASE               => PDO::CASE_LOWER,
        ],
    ]
);

使用工廠類鏈接數據庫(Connecting using Factory)

使用一個簡單的ini文件來配置 / 鏈接數據庫。post

[database]
host     = TEST_DB_MYSQL_HOST
username = TEST_DB_MYSQL_USER
password = TEST_DB_MYSQL_PASSWD
dbname   = TEST_DB_MYSQL_NAME
port     = TEST_DB_MYSQL_PORT
charset  = TEST_DB_MYSQL_CHARSET
adapter  = mysql
<?php

use Phalcon\Config\Adapter\Ini;
use Phalcon\Db\Adapter\Pdo\Factory;
use Phalcon\Di;

$di     = new Di();
$config = new Ini('config.ini');

$di->set('config', $config);

$di->set(
    'db',
    function () {
        return Factory::load($this->config->database);
    }
);

上述代碼返回數據庫鏈接實例,這樣作的好處是能夠在不修改應用代碼的狀況下改變數據庫鏈接甚至是數據庫適配器。

查詢記錄(Finding Rows)

Phalcon\Db提供了多種查詢方法。這種狀況下,SQL必須遵循數據庫引擎的特定語法:

<?php

$sql = "SELECT id, name FROM robots ORDER BY name";

// 發送SQL語句到數據庫
$result = $connection->query($sql);

// 打印robot的name字段
while ($robot = $result->fetch()) {
    echo $robot['name'];
}

// 獲取結果集數組
$robots = $connection->fetchAll($sql);
foreach ($robots as $robot) {
    echo $robot['name'];
}

// 獲取結果集中的第一條記錄
$robot = $connection->fetchOne($sql);

默認狀況下,調用這些方法會返回一個數組(關聯+索引)。能夠調用Phalcon\Db\Result::setFetchMode()方法改變這種行爲,該方法接收一個常量值,定義返回結果集的類型:

常量 說明
Phalcon\Db::FETCH_NUM 返回索引數組
Phalcon\Db::FETCH_ASSOC 返回關聯數組
Phalcon\Db::FETCH_BOTH 返回數組(索引+關聯)
Phalcon\Db::FETCH_OBJ 返回對象
<?php

$sql    = "SELECT id, name FROM robots ORDER BY name";
$result = $connection->query($sql);

$result->setFetchMode(Phalcon\Db::FETCH_NUM);
while ($robot = $result->fetch()) {
    echo $robot[0];
}

Phalcon\Db::query()方法返回一個Phalcon\Db\Result\Pdo實例。該對象封裝了與返回結果集相關的全部功能,如遍歷、查找特定行、統計總行數等。

<?php

$sql    = "SELECT id, name FROM robots";
$result = $connection->query($sql);

// 遍歷結果集
while ($robot = $result->fetch()) {
    echo $robot['name'];
}

// 查找第三行
$result->seek(2);
$robot = $result->fetch();

// 計算總行數
echo $result->numRows();

參數綁定(Binding Parameters)

Phalcon\Db支持參數綁定。使用參數綁定會影響性能,但能夠防止SQL注入。
支持字符串和數字佔位符,參數綁定能夠簡單的實現以下:

<?php

// 數字佔位符
$sql    = "SELECT * FROM robots WHERE name = ? ORDER BY name";
$result = $connection->query(
    $sql,
    [
        'Wall-E',
    ]
);

// 字符串佔位符
$sql     = "INSERT INTO `robots`(name, year) VALUES(:name, :year)";
$success = $connection->query(
    $sql,
    [
        'name' => 'Astro Boy',
        'year' => 1952,
    ]
);

使用數字佔位符時,須要將它們定義爲數字值(如1或2),'1'或'2'會被視爲字符串而非數字,致使佔位符不能被成功替換。使用任何數據庫適配器,數據都會被Pdo::Quote()自動轉義。該方法會考慮到鏈接字符集,所以建議在鏈接選項或服務器配置中定義正確的字符集,錯誤的字符集會在存儲或檢索數據時產生不良影響。
此外,能夠將參數直接傳遞給execute() / query()方法,這種狀況下的綁定參數會直接傳遞給PDO:

<?php

// PDO佔位符
$sql    = "SELECT * FROM robots WHERE name = ? ORDER BY name";
$result = $connection->query(
    $sql,
    [
        1 => 'Wall-E',
    ]
);

特定類型佔位符(Typed Placeholders)

佔位符容許執行參數綁定以免SQL注入:

<?php

$phql = "SELECT * FROM Store\Robots WHERE id > :id:";

$robots = $this->modelsManager->executeQuery(
    $phql,
    [
        'id' => 100,
    ]
);

某些數據庫系統在使用佔位符時須要執行額外操做,如指定綁定參數的類型:

<?php

use Phalcon\Db\Column;

// ...

$phql   = "SELECT * FROM Store\Robots LIMIT :number:";
$robots = $this->modelsManager->executeQuery(
    $phql,
    [
        'number' => 10,
    ],
    Column::BIND_PARAM_INT
);

能夠在參數中使用類型化的佔位符,而不用在executeQuery()方法中指定:

<?php

$phql   = "SELECT * FROM Store\Robots LIMIT {number:int}";
$robots = $this->modelsManager->executeQuery(
    $phql,
    [
        'number' => 10,
    ]
);

$phql   = "SELECT * FROM Store\Robots WHERE name <> {name:str}";
$robots = $this->modelsManager->executeQuery(
    $phql,
    [
        'name' => $name,
    ]
);

若是不須要指定綁定參數類型,能夠省略:

<?php

$phql   = "SELECT * FROM Store\Robots WHERE name <> {name}";
$robots = $this->modelsManager->executeQuery(
    $phql,
    [
        'name' => $name,
    ]
);

類型化的佔位符很強大,咱們能夠綁定靜態數組,而無需將每一個參數做爲佔位符單獨傳遞:

<?php

$phql   = "SELECT * FROM Store\Robots WHERE id IN ({ids:array})";
$robots = $this->modelsManager->executeQuery(
    $phql,
    [
        'ids' => [1, 2, 3, 4],
    ]
);

支持下列類型:

綁定類型 綁定類型常量 示例
str Column::BIND_PARAM_STR {name:str}
int Column::BIND_PARAM_INT {number:int}
double Column::BIND_PARAM_DECIMAL {price:double}
bool Column::BIND_PARAM_BOOL {enabled:bool}
blob Column::BIND_PARAM_BLOB {image:blob}
null Column::BIND_PARAM_NULL {exists:null}
array Column::BIND_PARAM_STR數組 {codes:array}
array-str Column::BIND_PARAM_STR數組 {names:array}
array-int Column::BIND_PARAM_INT數組 {flags:array}

綁定參數類型轉換(Cast bound parameters values)

默認狀況下,綁定參數不會在PHP中轉換爲指定類型,
如,在LIMIT / OFFSET中給佔位符傳遞一個字符串值就會致使錯誤:

<?php

$number = '100';
$robots = $modelsManager->executeQuery(
    "SELECT * FROM Some\Robots LIMIT {number:int}",
    [
        'number' => $number,
    ]
);

這會致使異常:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]:
Syntax error or access violation: 1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near ''100'' at line 1' in /Users/scott/demo.php:78

錯誤緣由是'100'是一個字符串。能夠先將值轉換爲整型:

<?php

$number = '100';
$robots = $modelsManager->executeQuery(
    "SELECT * FROM Some\Robots LIMIT {number:int}",
    [
        'number' => (int) $number,
    ]
);

要解決這個問題,須要開發者格外注意綁定參數類型及其如何傳遞。爲了簡化操做並避免異常,能夠指定Phalcon自動轉換:

<?php

\Phalcon\Db::setup(['forceCasting' => true]);

如下操做根據指定的綁定類型執行:

綁定類型 操做
Column::BIND_PARAM_STR 將值轉換爲PHP字符串
Column::BIND_PARAM_INT 將值轉換爲PHP整型
Column::BIND_PARAM_BOOL 將值轉換爲PHP布爾值
Column::BIND_PARAM_DECIMAL 將值轉換爲PHP浮點數

從數據庫返回的值在PDO中始終表示爲字符串,不管該列值是數字仍是布爾值。這種狀況是由於某些列類型因爲其大小限制而沒法用PHP原來類型表示。例如,MySQL中的BIGINT能夠存儲沒法用PHP 32位整型表示的大整數。因此,PDO和ORM默認將全部值做爲字符串。能夠設置ORM自動將這些值轉換爲PHP實際類型:

<?php

\Phalcon\Mvc\Model::setup(['castOnHydrate' => true]);

經過這種方式,可使用嚴格運算符或對變量類型進行假設:

<?php

$robot = Robots::findFirst();
if (11 === $robot->id) {
    echo $robot->name;
}

插入 / 更新 / 刪除記錄(Inserting / Updating / Deleting Rows)

可使用原生SQL或類方法來插入、更新、刪除記錄:

<?php

// 用原生SQL插入數據
$sql     = "INSERT INTO `robots`(`name`, `year`) VALUES('Astro Boy', 1952)";
$success = $connection->execute($sql);

// 使用佔位符
$sql     = "INSERT INTO `robots`(`name`, `year`) VALUES(?, ?)";
$success = $connection->execute(
    $sql,
    [
        'Astro Boy',
        1952,
    ]
);

// 動態生成SQL語句
$success = $connection->insert(
    'robots',
    [
        'Astro Boy',
        1952,
    ],
    [
        'name',
        'year',
    ]
);

// 動態生成SQL語句(另外一種語法)
$success = $connection->insertAsDict(
    'robots',
    [
        'name' => 'Astro Boy',
        'year' => 1952,
    ]
);

// 使用原生SQL更新數據
$sql     = "UPDATE `robots` SET `name` = 'Astro Boy' WHERE `id` = 101";
$success = $connection->execute($sql);

// 使用佔位符
$sql     = "UPDATE `robots` SET `name` = ? WHERE `id` = ?";
$success = $connection->execute(
    $sql,
    [
        'Astro Boy',
        101,
    ]
);

// 動態生成SQL語句
$success = $connection->update(
    'robots',
    [
        'name',
    ],
    [
        'New Astro Boy',
    ],
    'id = 101' // 注意,這種狀況下值不會被自動轉義
);

// 條件中數據的轉義
$success = $connection->update(
    'robots',
    [
        'name',
    ],
    [
        'New Astro Boy',
    ],
    [
        'conditions' => 'id = ?',
        'bind'       => [101],
        'bindTypes'  => [PDO::PARAM_INT], // 可選參數
    ]
);
$success = $connection->updateAsDict(
    'robots',
    [
        'name' => 'New Astro Boy',
    ],
    [
        'conditions' => 'id = ?',
        'bind'       => [101],
        'bindTypes'  => [PDO::PARAM_INT], // 可選參數
    ]
);

// 使用原生SQL刪除記錄
$sql     = "DELETE `robots` WHERE `id` = 101";
$success = $connection->execute($sql);

// 使用佔位符
$sql     = "DELETE `robots` WHERE `id` = ?";
$success = $connection->execute($sql, [101]);

// 動態生成SQL語句
$success = $connection->delete(
    'robots',
    'id = ?',
    [
        101,
    ]
);

事務和嵌套事務(Transactions and Nested Transactions)

PDO支持事務處理,在事務內部執行數據庫操做一般能夠提升數據庫的性能:

<?php

try {
    // 開始事務
    $connection->begin();

    // 執行SQL語句
    $connection->execute("DELETE `robots` WHERE `id` = 101");
    $connection->execute("DELETE `robots` WHERE `id` = 102");
    $connection->execute("DELETE `robots` WHERE `id` = 103");

    // 若是一切順利,提交事務
    $connection->commit();
} catch (Exception $e) {
    // 發生異常,回滾事務
    $connection->rollback();
}

除了標準事務,Phalcon\Db內置了嵌套事務(若是數據庫支持)。當再次調用begin()方法時,會建立一個嵌套事務:

<?php

try {
    // 開始事務
    $connection->begin();

    // 執行SQL語句
    $connection->execute("DELETE `robots` WHERE `id` = 101");

    try {
        // 開始嵌套事務
        $connection->begin();

        // 嵌套事務中執行SQL語句
        $connection->execute("DELETE `robots` WHERE `id` = 102");
        $connection->execute("DELETE `robots` WHERE `id` = 103");

        // 建立保存點
        $connection->commit();
    } catch (Exception $e) {
        // 發生異常,回滾嵌套事務
        $connection->rollback();
    }

    // 繼續執行更多SQL語句
    $connection->execute("DELETE `robots` WHERE `id` = 104");

    // 若是一切順利,提交事務
    $connection->commit();
} catch (Exception $e) {
    // 發生異常,回滾事務
    $connection->rollback();
}

數據庫事件(Database Events)

Phalcon\Db可以將事件發送給EventManager(若是存在),某些事件返回false時,可能會終止操做。支持如下事件:

事件名稱 觸發時機 是否會終止操做
afterConnect 成功鏈接到數據庫後
beforeQuery 執行SQL語句前
afterQuery 執行SQL語句後
beforeDisconnect 關閉臨時數據庫鏈接前
beginTransaction 事務開啓前
rollbackTransaction 事務回滾前
commitTransaction 事務提交前

將EventsManager綁定到數據庫鏈接很簡單,Phalcon\Db將觸發db類型事件:

<?php

use Phalcon\Db\Adapter\Pdo\Mysql as Connection;
use Phalcon\Events\Manager as EventsManager;

$eventsManager = new EventsManager();

// 監聽全部數據庫事件
$eventsManager->attch('db', $dbListener);

$connection = new Connection(
    [
        'host'     => 'localhost',
        'username' => 'root',
        'password' => 'secret',
        'dbname'   => 'invo',
    ]
);

// 將eventsManager分配給數據庫適配器實例
$connection->setEventsManager($eventsManager);

數據庫事件中,終止SQL操做很是有用。例如,想在SQL執行前實現注入檢查:

<?php

use Phalcon\Events\Event;

$eventsManager->attch(
    'db:beforeQuery',
    function (Event $event, $connection) {
        $sql = $connection->getSQLStatement();

        // 檢查SQL中是否有惡意關鍵字
        if (preg_match('/DROP|ALTER/i', $sql)) {
            // 不容許DROP / ALTERT操做
            return false;
        }

        return true;
    }
)

分析SQL語句(Profiling SQL Statements)

Phalcon\Db內置了性能分析組件Phalcon\Db\Profiler,用於分析數據庫性能,以便診斷問題,發現瓶頸。使用Phalcon\Db\Profiler進行數據庫分析至關容易:

<?php

use Phalcon\Db\Profiler as DbProfiler;
use Phalcon\Events\Event;
use Phalcon\Events\Manager as EventsManager;

$eventsManager = new EventsManager();

$profiler = new DbProfiler();

// 監聽全部數據庫事件
$eventsManager->attch(
    'db',
    function (Event $event, $connection) use ($profiler) {
        if ($event->getType() === 'beforeQuery') {
            $sql = $connection->getSQLStatement();

            // 開始分析
            $profiler->startProfile($sql);
        }

        if ($event->getType() === 'afterQuery') {
            // 中止分析
            $profiler->stopProfile();
        }
    }
);

// 將事件管理器分配給數據庫鏈接
$connection->setEventsManager($eventsManager);

$sql = "SELECT buyer_name, quantity, product_name FROM buyers LEFT JOIN products ON buyers.pid = products.id";

// 執行SQL語句
$connection->query($sql);

// 獲取最後一個分析結果
$profile = $profiler->getLastProfile();

echo 'SQL Statement: ', $profile->getSQLStatement(), "\n";
echo 'Start Time: ', $profile->getInitialTime(), "\n";
echo 'Final Time: ', $profile->getFinalTime(), "\n";
echo 'Total Elapsed Time: ', $profile->getTotalElapsedSeconds(), "\n";

還能夠基於Phalcon\Db\Profiler建立本身的分析器,以實時統計發送到數據庫的SQL語句:

<?php

use Phalcon\Db\Profiler as Profiler;
use Phalcon\Db\Profiler\Item as Item;
use Phalcon\Events\Manager as EventsManager;

class DbProfiler extends Profiler
{
    // SQL語句發送給數據庫服務器以前執行
    public function beforeStartProfile(Item $profile)
    {
        echo $profile->getSQLStatement();
    }

    // SQL語句發送到數據庫服務器以後執行
    public function afterEndProfile(Item $profile)
    {
        echo $profile->getTotalElapsedSeconds();
    }
}

// 建立事件管理器
$eventsManager = new EventsManager();

// 建立事件監聽器
$dbProfiler = new DbProfiler();

// 設置監聽器監聽全部數據庫事件
$eventsManager->attch('db', $dbProfiler);

記錄SQL語句(Logging SQL Statements)

使用諸如Phalcon\Db這樣的高級抽象組件來訪問數據庫時,很難獲知哪些語句被髮送到了數據庫。Phalcon\Logger配合Phalcon\Db使用,能夠在數據庫抽象層上提供日誌記錄功能。

<?php

use Phalcon\Events\Event;
use Phalcon\Events\Manager as EventsManager;
use Phalcon\Logger;
use Phalcon\Logger\Adapter\File as FileLogger;

$eventsManager = new EventsManager();

$logger = new FileLogger('app/logs/db.log');

$eventsManager->attch(
    'db:beforeQuery',
    function (Event $event, $connection) use ($logger) {
        $sql = $connection->getSQLStatement();

        $logger->log($sql, Logger::INFO);
    }
);

// 將eventsManager分配給數據庫適配器實例
$connection->setEventsManager($eventsManager);

// 執行SQL語句
$connection->insert(
    'products',
    [
        'Hot pepper',
        3.50,
    ],
    [
        'name',
        'price',
    ]
);

如上所述,文件app/logs/db.log將包含下列內容:

[Sun, 29 Apr 12 22:35:26 -0500][DEBUG][Resource Id #77] INSERT INTO products
(name, price) VALUES ('Hot pepper', 3.50)

自定義記錄器(Implementing your own Logger)

能夠自定義記錄器以記錄數據庫操做,經過建立一個實現了log()方法的類,該方法接受一個字符串做爲第一個參數。能夠將記錄器對象傳遞給Phalcon\Db::setLogger(),這樣在執行任何SQL語句時將調用log()方法進行記錄。

獲取表 / 視圖詳情(Describing Tables / Views)

Phalcon\Db提供了獲取表、視圖詳情的方法:

<?php

// 獲取test_db庫中的數據表
$tables = $connection->listTables('test_db');

// 表'robots'是否存在於當前庫中
$exists = $connection->tableExists('robots');

// 獲取'robots'表字段名稱、類型、特性
$fields = $connection->describeColumns('robots');
foreach ($fields as $field) {
    echo 'Column Type: ', $field['Type'];
}

// 獲取'robots'表索引
$indexes = $connection->describeIndexes('robots');
foreach ($indexes as $index) {
    print_r(
        $index->getColumns()
    );
}

// 獲取'robots'表外鍵
$references = $connection->describeReferences('robots');
foreach ($references as $reference) {
    // 打印引用列
    print_r(
        $reference->getReferenceColumns()
    );
}

表詳情和MySQL的describe命令返回的信息類似,包含以下信息:

Field Type Key Null
字段名稱 字段類型 是否主鍵或索引列 是否容許爲空

對於被支持的數據庫系統,一樣實現了獲取視圖詳情的方法:

<?php

// 獲取test_db庫中的視圖
$tables = $connection->listViews('test_db');

// 視圖'robots'是否存在於當前庫中
$exists = $connection->viewExists('robots');

建立、修改、刪除表(Creating / Alerting / Dropping Tables)

不一樣的數據庫系統(MySQL,Postgresql等)經過CREATE、ALTER、DROP命令提供了用於建立、修改、刪除數據表的功能。SQL語法因數據庫而異。Phalcon\Db爲編輯表提供了統一接口,無需區分不一樣數據庫系統的SQL語法。

建立表(Creating Tables)

下面例子展現如何建立表:

<?php

use Phalcon\Db\Column as Column;

$connection->createTable(
    'robots',
    null,
    [
        'columns' => [
            new Column(
                'id',
                [
                    'type'          => Column::TYPE_INTEGER,
                    'size'          => 10,
                    'notNull'       => true,
                    'autoIncrement' => true,
                    'primary'       => true,
                ]
            ),
            new Column(
                'name',
                [
                    'type'    => Column::TYPE_VARCHAR,
                    'size'    => 70,
                    'notNull' => true,
                ]
            ),
            new Column(
                'year',
                [
                    'type'    => Column::TYPE_INTEGER,
                    'size'    => 11,
                    'notNull' => true,
                ]
            ),
        ],
    ]
);

Phalcon\Db::createTable()接收一個描述數據表的關聯數組,用Phalcon\Db\Column類建立字段,下表列出了定義字段的選項:

選項 說明 是否可選
type 字段類型,必須是PhalconDbColumn常量
primary 是否主鍵
size VARCHARINTEGER類型的字段定義字段長度
scale DEMICALNUMBER類型字段定義數據精度
unsigned INTEGER類型字段定義是否有符號,該選項不適用於其餘類型字段
notNull 字段是否非空
default 默認值
autoIncrement 是否自增
bind BIND_TYPE_*常量定義字段在保存前如何綁定數據
first 把字段設置爲表的第一個字段
after 設置字段放在指定字段以後

Phalcon\Db支持下列字段類型:

  • Phalcon\Db\Column::TYPE_INTEGER
  • Phalcon\Db\Column::TYPE_DATE
  • Phalcon\Db\Column::TYPE_VARCHAR
  • Phalcon\Db\Column::TYPE_DECIMAL
  • Phalcon\Db\Column::TYPE_DATETIME
  • Phalcon\Db\Column::TYPE_CHAR
  • Phalcon\Db\Column::TYPE_TEXT

傳入Phalcon\Db::createTable()方法的關聯數組可能包含下列索引:

索引 說明 是否可選
columns Phalcon\Db\Column定義的字段組成的數組
indexes Phalcon\Db\Index定義的表索引組成的數組
references Phalcon\Db\Reference定義的表引用(外鍵)組成的數組
options 包含表建立選項的數組,這些選項一般與數據庫遷移相關

編輯表(Alerting Tables)

隨着應用程序愈來愈龐雜,可能須要調整數據庫,做爲重構或添加新功能的一部分。並不是全部數據庫系統都容許修改列或者新增列,Phalcon\Db也受到這些限制:

<?php

use Phalcon\Db\Column as Column;

// 新增列
$connection->addColumn(
    'robots',
    null,
    new Column(
        'robot_type',
        [
            'type'    => Column::TYPE_VARCHAR,
            'size'    => 32,
            'notNull' => true,
            'after'   => 'name',
        ]
    )
);

// 編輯列
$connection->modifyColumn(
    'robots',
    null,
    new Column(
        'name',
        [
            'type'    => Column::TYPE_VARCHAR,
            'size'    => 40,
            'notNull' => true,
        ]
    )
);

// 刪除'name'列
$connection->dropColumn(
    'robots',
    null,
    'name'
);

刪除表(Dropping Tables)

刪除表示例:

<?php

// 從當前庫中刪除'robots'表
$connection->dropTable('robots');

// 從'machines'庫中刪除'robots'表
$connection->dropTable('robots', 'machines');
相關文章
相關標籤/搜索