摘要:原文發表于入門教程之模型提供了四種方式操作數據庫模型數據庫抽象層以及原生。創建模型模型類的命名必須符合駝峰命名法,而且須繼承自類文件路徑繼承自類。
原文發表于:Phalcon入門教程之模型
Phalcon 提供了四種方式操作Mysql數據庫:模型、PHQL、數據庫抽象層以及原生SQL。不論何種方式,首先都需要在DI中注冊 db 服務才能正常使用:
DI注冊db服務// 文件路徑:app/core/services.php $di -> setShared("db", function () use($config) { $dbconfig = $config -> database -> db; $dbconfig = $dbconfig -> toArray(); if (!is_array($dbconfig) || count($dbconfig)==0) { throw new Exception("the database config is error"); } $connection = new PhalconDbAdapterPdoMysql(array( "host" => $dbconfig["host"], "port" => $dbconfig["port"], "username" => $dbconfig["username"], "password" => $dbconfig["password"], "dbname" => $dbconfig["dbname"], "charset" => $dbconfig["charset"]) ); return $connection; });
數據庫連接信息配置如下:
// 文件路徑:app/config/system.php return array( //數據庫表配置 "database" => array( //數據庫連接信息 "db" => array( "host" => "127.0.0.1", "port" => 3306, "username" => "admin", "password" => "admin", "dbname" => "test", "charset" => "utf8", ), //表前綴 "prefix" => "test_", ), );記錄底層SQL語句
在我們開發過程中,有時候需要通過SQL語句來分析定位問題。那么,我們需要將ORM生成的底層SQL記錄到日志中。修改DI中注冊的 db 服務如下:
//文件路徑:app/core/services.php $di -> setShared("db", function () use($config) { $dbconfig = $config -> database -> db; $dbconfig = $dbconfig -> toArray(); if (!is_array($dbconfig) || count($dbconfig)==0) { throw new Exception("the database config is error"); } $eventsManager = new PhalconEventsManager(); // 分析底層sql性能,并記錄日志 $profiler = new PhalconDbProfiler(); $eventsManager -> attach("db", function ($event, $connection) use ($profiler) { if($event -> getType() == "beforeQuery"){ //在sql發送到數據庫前啟動分析 $profiler -> startProfile($connection -> getSQLStatement()); } if($event -> getType() == "afterQuery"){ //在sql執行完畢后停止分析 $profiler -> stopProfile(); //獲取分析結果 $profile = $profiler -> getLastProfile(); $sql = $profile->getSQLStatement(); $params = $connection->getSqlVariables(); (is_array($params) && count($params)) && $params = json_encode($params); $executeTime = $profile->getTotalElapsedSeconds(); //日志記錄 $currentDay = date("Ymd"); $logger = new PhalconLoggerAdapterFile(ROOT_PATH . "/app/cache/logs/{$currentDay}.log"); $logger -> debug("{$sql} {$params} {$executeTime}"); } }); $connection = new PhalconDbAdapterPdoMysql(array( "host" => $dbconfig["host"], "port" => $dbconfig["port"], "username" => $dbconfig["username"], "password" => $dbconfig["password"], "dbname" => $dbconfig["dbname"], "charset" => $dbconfig["charset"]) ); /* 注冊監聽事件 */ $connection->setEventsManager($eventsManager); return $connection; });
通過代碼可以看到,不僅是底層SQL,還將SQL綁定的參數(PDO預處理)和SQL執行時間也記錄到日志中了。日志記錄demo如下:
SELECT `users`.`uid` AS `uid`, `users`.`mobile` AS `mobile` FROM `users` WHERE `users`.`uid` = :uid LIMIT :APL0 {"uid":1,"APL0":1} 0.034402132034302
花括號({})中的就是SQL預處理時綁定的參數,最后的浮點數就是SQL執行時間(單位為秒)。
創建模型模型類的命名必須符合駝峰命名法,而且須繼承自 PhalconMvcModel 類:
// 文件路徑:app/frontend/models/ArticlesModel.php class Articles extends MarserAppFrontendModelsBaseModel { // MarserAppFrontendModelsBaseModel繼承自 PhalconMvcModel 類。 // 此處是再次封裝一個基礎模型類, 以方便后續的通用方法封裝 //... }數據庫表映射
默認情況下,Articles 模型類對應的數據表名是 articles ;若是 ArticlesTags 模型類,則對應的數據庫表名是 articles_tags , 即類名對應著表名。如果想映射到其他數據庫表,可以使用 setSource() 方法設置:
// 文件路徑:app/frontend/models/ArticlesModel.php class Articles extends MarserAppFrontendModelsBaseModel { public function initialize() { $this->setSource("articles_tags"); } }
在項目開發中,建議一個數據表對應著一個模型類。即使是關聯表,也強烈建議創建其對應的模型類,因為 Phalcon 中提供的連表操作,都是基于模型類的(后續的教程會分享)。
設置表前綴在進行數據庫表設計的時候,有時會在表名前加上一段前綴,如 test_articles 。我們依然可以通過 setSource() 映射數據表:
// 文件路徑:app/frontend/models/ArticlesModel.php class Articles extends MarserAppFrontendModelsBaseModel { public function initialize() { $this->setSource("test_articles"); } }
假設,我們的項目中有100張數據表,那么就意味著有100個模型類。此時我們在每個模型類中都必須調用 setSource() 來映射完整的表名。如果某天我們需要修改這100張表的前綴,那么將要修改這100個模型類,不僅耗時耗力還麻煩。我們嘗試著將此處理過程提取出來進行封裝:
// 文件路徑: app/frontend/models/ArticlesModel.php class ArticlesModel extends MarserAppFrontendModelsBaseModel { /** * 表名 */ const TABLE_NAME = "articles"; public function initialize(){ parent::initialize(); //映射數據表(補上表前綴) $this->set_table_source(self::TABLE_NAME); } }
在 BaseModel 模型基類中的 set_table_source() 方法定義如下:
// 文件路徑: app/frontend/models/BaseModel.php class BaseModel extends PhalconMvcModel { public function initialize(){ } /** * 映射數據表(補上表前綴) * @param string $tableName * @param null $prefix */ protected function set_table_source($tableName, $prefix = null){ //默認從配置中讀取表前綴配置 empty($prefix) && $prefix = $this->getDI()->get("config")->database->prefix; //拼接成完整表名之后,再通過setSource()映射數據表 $this->setSource($prefix . $tableName); } }
我們在每個模型類中定義一個 類常量 來存儲無前綴的表名,再通過 set_table_source() 成員方法來拼接表前綴并映射。眼尖的讀者,應該在上面的數據庫連接信息配置中有看到 prefix 的表前綴配置。
還是以上面為例,此時我們就不需要修改100個模型類的代碼,而只需修改配置文件中的 prefix 配置即可。
以上代碼已托管在github:https://github.com/KevinJay/m...
最后,歡迎大家加入QQ群交流討論:
廣州PHP高端交流群:158587573
Phalcon玩家群:150237524
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23021.html
摘要:原文發表于入門教程之目錄結構很多初學的朋友,對于以框架為基礎構建的項目,應該如何組織目錄結構有點摸不著頭腦。只需要通過注冊這些目錄結構,即可正常使用。 原文發表于:Phalcon入門教程之目錄結構 很多初學Phalcon的朋友,對于以Phalcon框架為基礎構建的項目,應該如何組織目錄結構有點摸不著頭腦。比如多模塊的項目中,如何共用libs類庫和models目錄中模型類的情況,就有很...
摘要:異步隊列消費者開發只提供了模式下運行控制器方法,并未提供主進程多子進程的進程模型,并未提供多線程處理。多線程異步隊列服務只需寫好控制器方法,然后在配置文件中配置下路由命名空間進程線程數量,就可在模式中啟動多進程多線程模型的異步隊列處理程序。 最近業余時間一直在開發ExpressPHP的第二個版本 MixPHP,今天下班想起之前一個面試官的問題:你為什么還要再造一個輪子呢?仔細回想,第一...
摘要:使用模型模型表示應用程序信息數據以及這些數據的處理規則,主要用于管理與對應數據表的交互規則。應用中,是所有模型的基類。創建模型模型需繼承類,以大駝峰格式命名。方法在請求期間只調用一次,目的是為該模型的所有實例執行初始化操作。 使用模型(Working with Models) 模型表示應用程序信息(數據)以及這些數據的處理規則,主要用于管理與對應數據表的交互規則。大多數情況下,數據庫中...
摘要:本文描述了框架中數據庫操作方法,主要討論框架的組件中的操作方法。屬性方法在框架中支持屬性的擴展查詢,在上例中,可以把條件語句改為同時省略查詢條件結果不變。 本文描述了PHP-Phalcon框架中數據庫操作方法,主要討論Phalcon框架的Model組件中的操作方法。更詳細的Model介紹請參考:官方文檔 1. 連接數據庫 在Phalcon框架中,通過在DI中注入db參數來實現數據庫的...
摘要:若在云服務器上安裝失敗或者卡住,可參考此博文云服務器編譯安裝失敗 Phalcon安裝 # 下載安裝包 wget https://github.com/phalcon/cphalcon/archive/v3.0.1.tar.gz # 重命名 mv v3.0.1.tar.gz cphalcon-3.0.1.tar.gz #解壓 tar -zxvf...
閱讀 3469·2021-09-02 09:53
閱讀 1793·2021-08-26 14:13
閱讀 2750·2019-08-30 15:44
閱讀 1313·2019-08-30 14:03
閱讀 1962·2019-08-26 13:42
閱讀 3014·2019-08-26 12:21
閱讀 1302·2019-08-26 11:54
閱讀 1899·2019-08-26 10:46