摘要:數(shù)據(jù)庫抽象層是底層組件,由它驅(qū)動框架中的模型層。它完全由語言編寫,是一個獨立的數(shù)據(jù)庫高級抽象層。使用任何數(shù)據(jù)庫適配器,數(shù)據(jù)都會被自動轉(zhuǎn)義。配合使用,可以在數(shù)據(jù)庫抽象層上提供日志記錄功能。語法因數(shù)據(jù)庫而異。并非所有數(shù)據(jù)庫系統(tǒng)都允許修改列或
數(shù)據(jù)庫抽象層(Database Abstraction Layer)
PhalconDb是PhalconMvcModel底層組件,由它驅(qū)動框架中的模型層。它完全由C語言編寫,是一個獨立的數(shù)據(jù)庫高級抽象層。
與傳統(tǒng)模型相比,該組件允許更底層的數(shù)據(jù)庫操作。
數(shù)據(jù)庫適配器(Database Adapters)該組件使用適配器來封裝特定的數(shù)據(jù)庫操作。Phalcon使用PDO連接數(shù)據(jù)庫,支持下列數(shù)據(jù)庫引擎:
類 | 說明 |
---|---|
PhalconDbAdapterPdoMysql | 世界上最流行的關(guān)系型數(shù)據(jù)庫系統(tǒng)(RDBMS),作為服務(wù)器運行,支持多用戶、多數(shù)據(jù)庫訪問 |
PhalconDbAdapterPdoPostgresql | Postgresql是一個強(qiáng)大的開源關(guān)系數(shù)據(jù)庫系統(tǒng),超過15年的發(fā)展和通過驗證的架構(gòu),為其贏得了正確、可靠、數(shù)據(jù)完整的良好聲譽 |
PhalconDbAdapterPdoSqlite | SQLite是一個實現(xiàn)自包含、無服務(wù)、零配置的事務(wù)型數(shù)據(jù)庫 |
使用適配器選項加載PDO:
"localhost", "dbname" => "blog", "port" => 3306, "username" => "sigma", "password" => "secret", "adapter" => "mysql", ]; $db = Factory::load($options);自定義適配器(Implementing your own adapters)
創(chuàng)建自定義數(shù)據(jù)庫適配器或擴(kuò)展現(xiàn)有適配器,必須實現(xiàn)PhalconDbAdapterInterface接口。
數(shù)據(jù)庫語言(Database Dialects)phalcon語言封裝了每個數(shù)據(jù)庫的具體操作,為適配器提供通用方法和SQL生成器。
類 | 說明 |
---|---|
PhalconDbDialectMysql | MySQL特定語言 |
PhalconDbDialectPostgresql | Postgresql特定語言 |
PhalconDbDialectSqlite | SQLite特定語言 |
創(chuàng)建自定義數(shù)據(jù)庫語言或擴(kuò)展現(xiàn)有語言,必須實現(xiàn)PhalconDbDialectInterface接口。
連接數(shù)據(jù)庫(Connection to Databases)建立數(shù)據(jù)庫連接,必須實例化適配器類,它只接收一個包含連接參數(shù)的數(shù)組。下面例子展示了如何傳遞必選參數(shù)和可選參數(shù)來建立數(shù)據(jù)庫連接:
"127.0.0.1", "username" => "mike", "password" => "sigma", "dbname" => "test_db", ]; // 可選參數(shù) $config["persistent"] = false; // 建立連接 $connection = new PhalconDbAdapterPdoMysql($config);
"localhost", "username" => "postgres", "password" => "secret1", "dbname" => "template", ]; // 可選參數(shù) $config["schema"] = "public"; // 建立連接 $connection = new PhalconDbAdapterPdoPostgresql($config);設(shè)置額外的PDO選項(Setting up additional PDO options)
在建立連接時,傳遞options參數(shù)設(shè)置PDO:
"localhost", "username" => "root", "password" => "sigma", "dbname" => "test_db", "options" => [ PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8", PDO::ATTR_CASE => PDO::CASE_LOWER, ], ] );使用工廠類連接數(shù)據(jù)庫(Connecting using Factory)
使用一個簡單的ini文件來配置 / 連接數(shù)據(jù)庫。
[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
set("config", $config); $di->set( "db", function () { return Factory::load($this->config->database); } );
上述代碼返回數(shù)據(jù)庫連接實例,這樣做的好處是可以在不修改應(yīng)用代碼的情況下改變數(shù)據(jù)庫連接甚至是數(shù)據(jù)庫適配器。
查詢記錄(Finding Rows)PhalconDb提供了多種查詢方法。這種情況下,SQL必須遵循數(shù)據(jù)庫引擎的特定語法:
query($sql); // 打印robot的name字段 while ($robot = $result->fetch()) { echo $robot["name"]; } // 獲取結(jié)果集數(shù)組 $robots = $connection->fetchAll($sql); foreach ($robots as $robot) { echo $robot["name"]; } // 獲取結(jié)果集中的第一條記錄 $robot = $connection->fetchOne($sql);
默認(rèn)情況下,調(diào)用這些方法會返回一個數(shù)組(關(guān)聯(lián)+索引)。可以調(diào)用PhalconDbResult::setFetchMode()方法改變這種行為,該方法接收一個常量值,定義返回結(jié)果集的類型:
常量 | 說明 |
---|---|
PhalconDb::FETCH_NUM | 返回索引數(shù)組 |
PhalconDb::FETCH_ASSOC | 返回關(guān)聯(lián)數(shù)組 |
PhalconDb::FETCH_BOTH | 返回數(shù)組(索引+關(guān)聯(lián)) |
PhalconDb::FETCH_OBJ | 返回對象 |
query($sql); $result->setFetchMode(PhalconDb::FETCH_NUM); while ($robot = $result->fetch()) { echo $robot[0]; }
PhalconDb::query()方法返回一個PhalconDbResultPdo實例。該對象封裝了與返回結(jié)果集相關(guān)的所有功能,如遍歷、查找特定行、統(tǒng)計總行數(shù)等。
query($sql); // 遍歷結(jié)果集 while ($robot = $result->fetch()) { echo $robot["name"]; } // 查找第三行 $result->seek(2); $robot = $result->fetch(); // 計算總行數(shù) echo $result->numRows();參數(shù)綁定(Binding Parameters)
PhalconDb支持參數(shù)綁定。使用參數(shù)綁定會影響性能,但可以防止SQL注入。
支持字符串和數(shù)字占位符,參數(shù)綁定可以簡單的實現(xiàn)如下:
query( $sql, [ "Wall-E", ] ); // 字符串占位符 $sql = "INSERT INTO `robots`(name, year) VALUES(:name, :year)"; $success = $connection->query( $sql, [ "name" => "Astro Boy", "year" => 1952, ] );
使用數(shù)字占位符時,需要將它們定義為數(shù)字值(如1或2),"1"或"2"會被視為字符串而非數(shù)字,導(dǎo)致占位符不能被成功替換。使用任何數(shù)據(jù)庫適配器,數(shù)據(jù)都會被Pdo::Quote()自動轉(zhuǎn)義。該方法會考慮到連接字符集,因此建議在連接選項或服務(wù)器配置中定義正確的字符集,錯誤的字符集會在存儲或檢索數(shù)據(jù)時產(chǎn)生不良影響。
此外,可以將參數(shù)直接傳遞給execute() / query()方法,這種情況下的綁定參數(shù)會直接傳遞給PDO:
query( $sql, [ 1 => "Wall-E", ] );特定類型占位符(Typed Placeholders)
占位符允許執(zhí)行參數(shù)綁定以避免SQL注入:
:id:"; $robots = $this->modelsManager->executeQuery( $phql, [ "id" => 100, ] );
某些數(shù)據(jù)庫系統(tǒng)在使用占位符時需要執(zhí)行額外操作,如指定綁定參數(shù)的類型:
modelsManager->executeQuery( $phql, [ "number" => 10, ], Column::BIND_PARAM_INT );
可以在參數(shù)中使用類型化的占位符,而不用在executeQuery()方法中指定:
modelsManager->executeQuery( $phql, [ "number" => 10, ] ); $phql = "SELECT * FROM StoreRobots WHERE name <> {name:str}"; $robots = $this->modelsManager->executeQuery( $phql, [ "name" => $name, ] );
如果不需要指定綁定參數(shù)類型,可以省略:
{name}"; $robots = $this->modelsManager->executeQuery( $phql, [ "name" => $name, ] );
類型化的占位符很強(qiáng)大,我們可以綁定靜態(tài)數(shù)組,而無需將每個參數(shù)作為占位符多帶帶傳遞:
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數(shù)組 | {codes:array} |
array-str | Column::BIND_PARAM_STR數(shù)組 | {names:array} |
array-int | Column::BIND_PARAM_INT數(shù)組 | {flags:array} |
默認(rèn)情況下,綁定參數(shù)不會在PHP中轉(zhuǎn)換為指定類型,
如,在LIMIT / OFFSET中給占位符傳遞一個字符串值就會導(dǎo)致錯誤:
executeQuery( "SELECT * FROM SomeRobots LIMIT {number:int}", [ "number" => $number, ] );
這會導(dǎo)致異常:
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"是一個字符串。可以先將值轉(zhuǎn)換為整型:
executeQuery( "SELECT * FROM SomeRobots LIMIT {number:int}", [ "number" => (int) $number, ] );
要解決這個問題,需要開發(fā)者格外注意綁定參數(shù)類型及其如何傳遞。為了簡化操作并避免異常,可以指定Phalcon自動轉(zhuǎn)換:
true]);
以下操作根據(jù)指定的綁定類型執(zhí)行:
綁定類型 | 操作 |
---|---|
Column::BIND_PARAM_STR | 將值轉(zhuǎn)換為PHP字符串 |
Column::BIND_PARAM_INT | 將值轉(zhuǎn)換為PHP整型 |
Column::BIND_PARAM_BOOL | 將值轉(zhuǎn)換為PHP布爾值 |
Column::BIND_PARAM_DECIMAL | 將值轉(zhuǎn)換為PHP浮點數(shù) |
從數(shù)據(jù)庫返回的值在PDO中始終表示為字符串,無論該列值是數(shù)字還是布爾值。這種情況是因為某些列類型由于其大小限制而無法用PHP原來類型表示。例如,MySQL中的BIGINT可以存儲無法用PHP 32位整型表示的大整數(shù)。所以,PDO和ORM默認(rèn)將所有值作為字符串。可以設(shè)置ORM自動將這些值轉(zhuǎn)換為PHP實際類型:
true]);
通過這種方式,可以使用嚴(yán)格運算符或?qū)ψ兞款愋瓦M(jìn)行假設(shè):
id) { echo $robot->name; }插入 / 更新 / 刪除記錄(Inserting / Updating / Deleting Rows)
可以使用原生SQL或類方法來插入、更新、刪除記錄:
execute($sql); // 使用占位符 $sql = "INSERT INTO `robots`(`name`, `year`) VALUES(?, ?)"; $success = $connection->execute( $sql, [ "Astro Boy", 1952, ] ); // 動態(tài)生成SQL語句 $success = $connection->insert( "robots", [ "Astro Boy", 1952, ], [ "name", "year", ] ); // 動態(tài)生成SQL語句(另一種語法) $success = $connection->insertAsDict( "robots", [ "name" => "Astro Boy", "year" => 1952, ] ); // 使用原生SQL更新數(shù)據(jù) $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, ] ); // 動態(tài)生成SQL語句 $success = $connection->update( "robots", [ "name", ], [ "New Astro Boy", ], "id = 101" // 注意,這種情況下值不會被自動轉(zhuǎn)義 ); // 條件中數(shù)據(jù)的轉(zhuǎn)義 $success = $connection->update( "robots", [ "name", ], [ "New Astro Boy", ], [ "conditions" => "id = ?", "bind" => [101], "bindTypes" => [PDO::PARAM_INT], // 可選參數(shù) ] ); $success = $connection->updateAsDict( "robots", [ "name" => "New Astro Boy", ], [ "conditions" => "id = ?", "bind" => [101], "bindTypes" => [PDO::PARAM_INT], // 可選參數(shù) ] ); // 使用原生SQL刪除記錄 $sql = "DELETE `robots` WHERE `id` = 101"; $success = $connection->execute($sql); // 使用占位符 $sql = "DELETE `robots` WHERE `id` = ?"; $success = $connection->execute($sql, [101]); // 動態(tài)生成SQL語句 $success = $connection->delete( "robots", "id = ?", [ 101, ] );事務(wù)和嵌套事務(wù)(Transactions and Nested Transactions)
PDO支持事務(wù)處理,在事務(wù)內(nèi)部執(zhí)行數(shù)據(jù)庫操作通常可以提高數(shù)據(jù)庫的性能:
begin(); // 執(zhí)行SQL語句 $connection->execute("DELETE `robots` WHERE `id` = 101"); $connection->execute("DELETE `robots` WHERE `id` = 102"); $connection->execute("DELETE `robots` WHERE `id` = 103"); // 如果一切順利,提交事務(wù) $connection->commit(); } catch (Exception $e) { // 發(fā)生異常,回滾事務(wù) $connection->rollback(); }
除了標(biāo)準(zhǔn)事務(wù),PhalconDb內(nèi)置了嵌套事務(wù)(如果數(shù)據(jù)庫支持)。當(dāng)再次調(diào)用begin()方法時,會創(chuàng)建一個嵌套事務(wù):
begin(); // 執(zhí)行SQL語句 $connection->execute("DELETE `robots` WHERE `id` = 101"); try { // 開始嵌套事務(wù) $connection->begin(); // 嵌套事務(wù)中執(zhí)行SQL語句 $connection->execute("DELETE `robots` WHERE `id` = 102"); $connection->execute("DELETE `robots` WHERE `id` = 103"); // 創(chuàng)建保存點 $connection->commit(); } catch (Exception $e) { // 發(fā)生異常,回滾嵌套事務(wù) $connection->rollback(); } // 繼續(xù)執(zhí)行更多SQL語句 $connection->execute("DELETE `robots` WHERE `id` = 104"); // 如果一切順利,提交事務(wù) $connection->commit(); } catch (Exception $e) { // 發(fā)生異常,回滾事務(wù) $connection->rollback(); }數(shù)據(jù)庫事件(Database Events)
PhalconDb能夠?qū)⑹录l(fā)送給EventManager(如果存在),某些事件返回false時,可能會終止操作。支持以下事件:
事件名稱 | 觸發(fā)時機(jī) | 是否會終止操作 |
---|---|---|
afterConnect | 成功連接到數(shù)據(jù)庫后 | 否 |
beforeQuery | 執(zhí)行SQL語句前 | 是 |
afterQuery | 執(zhí)行SQL語句后 | 否 |
beforeDisconnect | 關(guān)閉臨時數(shù)據(jù)庫連接前 | 否 |
beginTransaction | 事務(wù)開啟前 | 否 |
rollbackTransaction | 事務(wù)回滾前 | 否 |
commitTransaction | 事務(wù)提交前 | 否 |
將EventsManager綁定到數(shù)據(jù)庫連接很簡單,PhalconDb將觸發(fā)db類型事件:
attch("db", $dbListener); $connection = new Connection( [ "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo", ] ); // 將eventsManager分配給數(shù)據(jù)庫適配器實例 $connection->setEventsManager($eventsManager);
數(shù)據(jù)庫事件中,終止SQL操作非常有用。例如,想在SQL執(zhí)行前實現(xiàn)注入檢查:
attch( "db:beforeQuery", function (Event $event, $connection) { $sql = $connection->getSQLStatement(); // 檢查SQL中是否有惡意關(guān)鍵字 if (preg_match("/DROP|ALTER/i", $sql)) { // 不允許DROP / ALTERT操作 return false; } return true; } )分析SQL語句(Profiling SQL Statements)
PhalconDb內(nèi)置了性能分析組件PhalconDbProfiler,用于分析數(shù)據(jù)庫性能,以便診斷問題,發(fā)現(xiàn)瓶頸。使用PhalconDbProfiler進(jìn)行數(shù)據(jù)庫分析相當(dāng)容易:
attch( "db", function (Event $event, $connection) use ($profiler) { if ($event->getType() === "beforeQuery") { $sql = $connection->getSQLStatement(); // 開始分析 $profiler->startProfile($sql); } if ($event->getType() === "afterQuery") { // 停止分析 $profiler->stopProfile(); } } ); // 將事件管理器分配給數(shù)據(jù)庫連接 $connection->setEventsManager($eventsManager); $sql = "SELECT buyer_name, quantity, product_name FROM buyers LEFT JOIN products ON buyers.pid = products.id"; // 執(zhí)行SQL語句 $connection->query($sql); // 獲取最后一個分析結(jié)果 $profile = $profiler->getLastProfile(); echo "SQL Statement: ", $profile->getSQLStatement(), " "; echo "Start Time: ", $profile->getInitialTime(), " "; echo "Final Time: ", $profile->getFinalTime(), " "; echo "Total Elapsed Time: ", $profile->getTotalElapsedSeconds(), " ";
還可以基于PhalconDbProfiler創(chuàng)建自己的分析器,以實時統(tǒng)計發(fā)送到數(shù)據(jù)庫的SQL語句:
getSQLStatement(); } // SQL語句發(fā)送到數(shù)據(jù)庫服務(wù)器之后執(zhí)行 public function afterEndProfile(Item $profile) { echo $profile->getTotalElapsedSeconds(); } } // 創(chuàng)建事件管理器 $eventsManager = new EventsManager(); // 創(chuàng)建事件監(jiān)聽器 $dbProfiler = new DbProfiler(); // 設(shè)置監(jiān)聽器監(jiān)聽所有數(shù)據(jù)庫事件 $eventsManager->attch("db", $dbProfiler);記錄SQL語句(Logging SQL Statements)
使用諸如PhalconDb這樣的高級抽象組件來訪問數(shù)據(jù)庫時,很難獲知哪些語句被發(fā)送到了數(shù)據(jù)庫。PhalconLogger配合PhalconDb使用,可以在數(shù)據(jù)庫抽象層上提供日志記錄功能。
attch( "db:beforeQuery", function (Event $event, $connection) use ($logger) { $sql = $connection->getSQLStatement(); $logger->log($sql, Logger::INFO); } ); // 將eventsManager分配給數(shù)據(jù)庫適配器實例 $connection->setEventsManager($eventsManager); // 執(zhí)行SQL語句 $connection->insert( "products", [ "Hot pepper", 3.50, ], [ "name", "price", ] );
如上所述,文件app/logs/db.log將包含下列內(nèi)容:
[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)
可以自定義記錄器以記錄數(shù)據(jù)庫操作,通過創(chuàng)建一個實現(xiàn)了log()方法的類,該方法接受一個字符串作為第一個參數(shù)。可以將記錄器對象傳遞給PhalconDb::setLogger(),這樣在執(zhí)行任何SQL語句時將調(diào)用log()方法進(jìn)行記錄。
獲取表 / 視圖詳情(Describing Tables / Views)PhalconDb提供了獲取表、視圖詳情的方法:
listTables("test_db"); // 表"robots"是否存在于當(dāng)前庫中 $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 |
---|---|---|---|
字段名稱 | 字段類型 | 是否主鍵或索引列 | 是否允許為空 |
對于被支持的數(shù)據(jù)庫系統(tǒng),同樣實現(xiàn)了獲取視圖詳情的方法:
listViews("test_db"); // 視圖"robots"是否存在于當(dāng)前庫中 $exists = $connection->viewExists("robots");創(chuàng)建、修改、刪除表(Creating / Alerting / Dropping Tables)
不同的數(shù)據(jù)庫系統(tǒng)(MySQL,Postgresql等)通過CREATE、ALTER、DROP命令提供了用于創(chuàng)建、修改、刪除數(shù)據(jù)表的功能。SQL語法因數(shù)據(jù)庫而異。PhalconDb為編輯表提供了統(tǒng)一接口,無需區(qū)分不同數(shù)據(jù)庫系統(tǒng)的SQL語法。
創(chuàng)建表(Creating Tables)下面例子展示如何創(chuàng)建表:
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, ] ), ], ] );
PhalconDb::createTable()接收一個描述數(shù)據(jù)表的關(guān)聯(lián)數(shù)組,用PhalconDbColumn類創(chuàng)建字段,下表列出了定義字段的選項:
選項 | 說明 | 是否可選 |
---|---|---|
type | 字段類型,必須是PhalconDbColumn常量 | 否 |
primary | 是否主鍵 | 是 |
size | VARCHAR或INTEGER類型的字段定義字段長度 | 是 |
scale | DEMICAL或NUMBER類型字段定義數(shù)據(jù)精度 | 是 |
unsigned | INTEGER類型字段定義是否有符號,該選項不適用于其他類型字段 | 是 |
notNull | 字段是否非空 | 是 |
default | 默認(rèn)值 | 是 |
autoIncrement | 是否自增 | 是 |
bind | BIND_TYPE_*常量定義字段在保存前如何綁定數(shù)據(jù) | 是 |
first | 把字段設(shè)置為表的第一個字段 | 是 |
after | 設(shè)置字段放在指定字段之后 | 是 |
PhalconDb支持下列字段類型:
PhalconDbColumn::TYPE_INTEGER
PhalconDbColumn::TYPE_DATE
PhalconDbColumn::TYPE_VARCHAR
PhalconDbColumn::TYPE_DECIMAL
PhalconDbColumn::TYPE_DATETIME
PhalconDbColumn::TYPE_CHAR
PhalconDbColumn::TYPE_TEXT
傳入PhalconDb::createTable()方法的關(guān)聯(lián)數(shù)組可能包含下列索引:
索引 | 說明 | 是否可選 |
---|---|---|
columns | 由PhalconDbColumn定義的字段組成的數(shù)組 | 否 |
indexes | 由PhalconDbIndex定義的表索引組成的數(shù)組 | 是 |
references | 由PhalconDbReference定義的表引用(外鍵)組成的數(shù)組 | 是 |
options | 包含表創(chuàng)建選項的數(shù)組,這些選項通常與數(shù)據(jù)庫遷移相關(guān) | 是 |
隨著應(yīng)用程序越來越龐雜,可能需要調(diào)整數(shù)據(jù)庫,作為重構(gòu)或添加新功能的一部分。并非所有數(shù)據(jù)庫系統(tǒng)都允許修改列或者新增列,PhalconDb也受到這些限制:
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)
刪除表示例:
dropTable("robots"); // 從"machines"庫中刪除"robots"表 $connection->dropTable("robots", "machines");
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28531.html
摘要:使用模型模型表示應(yīng)用程序信息數(shù)據(jù)以及這些數(shù)據(jù)的處理規(guī)則,主要用于管理與對應(yīng)數(shù)據(jù)表的交互規(guī)則。應(yīng)用中,是所有模型的基類。創(chuàng)建模型模型需繼承類,以大駝峰格式命名。方法在請求期間只調(diào)用一次,目的是為該模型的所有實例執(zhí)行初始化操作。 使用模型(Working with Models) 模型表示應(yīng)用程序信息(數(shù)據(jù))以及這些數(shù)據(jù)的處理規(guī)則,主要用于管理與對應(yīng)數(shù)據(jù)表的交互規(guī)則。大多數(shù)情況下,數(shù)據(jù)庫中...
摘要:原文發(fā)表于入門教程之模型提供了四種方式操作數(shù)據(jù)庫模型數(shù)據(jù)庫抽象層以及原生。創(chuàng)建模型模型類的命名必須符合駝峰命名法,而且須繼承自類文件路徑繼承自類。 原文發(fā)表于:Phalcon入門教程之模型 Phalcon 提供了四種方式操作Mysql數(shù)據(jù)庫:模型、PHQL、數(shù)據(jù)庫抽象層以及原生SQL。不論何種方式,首先都需要在DI中注冊 db 服務(wù)才能正常使用: DI注冊db服務(wù) // 文件路徑:...
摘要:查詢語言查詢語言,簡稱或,是一種面向?qū)ο蟮母呒壵Z言,允許用標(biāo)準(zhǔn)化的編寫。該對象的每個成員都是一個包含所查詢字段的標(biāo)準(zhǔn)對象。 Phalcon查詢語言(Phalcon Query Language) Phalcon查詢語言,簡稱PhalconQL或PHQL,是一種面向?qū)ο蟮母呒塖QL語言,允許用標(biāo)準(zhǔn)化的SQL編寫。PHQL實現(xiàn)了把操作語句解析為RDBMS目標(biāo)語言的解析器(C語言編寫)。 為...
摘要:一般至少要在執(zhí)行路由前要判斷用戶是否具有權(quán)限一般在中,所以應(yīng)該在它之前獲得填充。以下代碼可參考這里的方法就是重點。參考這里把對象保存在中。 showImg(https://segmentfault.com/img/bVkdih); 使用如下圖解釋這個組件: showImg(https://segmentfault.com/img/bVkdii); 實際最終真正要使用的是access_l...
摘要:幫助你開始使用的簡易指南。第一種方式參考第二種方式參考使用參考簡單粗暴的理解是把下的對應(yīng)成數(shù)據(jù)庫的表,類屬性對應(yīng)表字段。 幫助你開始使用 phalcon 的簡易指南。 簡介 Phalcon 2將于2015年4月17日發(fā)布,這個版本大約85%的代碼是基于 Zephir 語言重寫的。Zephir是開源的,使用類似PHP語法的語言,生成C語言代碼,并編譯成PHP擴(kuò)展。這提高了PHP擴(kuò)展的開發(fā)...
閱讀 2714·2021-11-11 16:54
閱讀 2331·2021-10-09 09:44
閱讀 2557·2019-08-30 15:54
閱讀 1942·2019-08-30 11:24
閱讀 1179·2019-08-29 17:03
閱讀 2110·2019-08-29 16:22
閱讀 2088·2019-08-29 13:11
閱讀 1053·2019-08-29 12:14