博客 / 詳情

返回

Phalcon數據庫抽象層

數據庫抽象層(Database Abstraction Layer)

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

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

數據庫適配器(Database Adapters)

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

説明
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)

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

<?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文件來配置 / 連接數據庫。

[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');
user avatar abei2017 頭像 oneziyu 頭像 mozhong_5eddab49b9d32 頭像 aoshunseo 頭像 qingliao 頭像 heyiming 頭像 liugongzi 頭像 h57 頭像 xiongmaoxianshi 頭像 hiyanxu 頭像
10 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.