成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Phalcon入門教程之模型

FreeZinG / 3144人閱讀

摘要:原文發(fā)表于入門教程之模型提供了四種方式操作數(shù)據(jù)庫模型數(shù)據(jù)庫抽象層以及原生。創(chuàng)建模型模型類的命名必須符合駝峰命名法,而且須繼承自類文件路徑繼承自類。

原文發(fā)表于:Phalcon入門教程之模型

Phalcon 提供了四種方式操作Mysql數(shù)據(jù)庫:模型、PHQL、數(shù)據(jù)庫抽象層以及原生SQL。不論何種方式,首先都需要在DI中注冊 db 服務(wù)才能正常使用:

DI注冊db服務(wù)
//  文件路徑: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;
});

數(shù)據(jù)庫連接信息配置如下:

// 文件路徑:app/config/system.php
return array(
    //數(shù)據(jù)庫表配置
    "database" => array(
        //數(shù)據(jù)庫連接信息
        "db" => array(
            "host" => "127.0.0.1",
            "port" => 3306,
            "username" => "admin",
            "password" => "admin",
            "dbname" => "test",
            "charset" => "utf8",
        ),

        //表前綴
        "prefix" => "test_",
    ),
);
記錄底層SQL語句

在我們開發(fā)過程中,有時候需要通過SQL語句來分析定位問題。那么,我們需要將ORM生成的底層SQL記錄到日志中。修改DI中注冊的 db 服務(wù)如下:

//文件路徑: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發(fā)送到數(shù)據(jù)庫前啟動分析
            $profiler -> startProfile($connection -> getSQLStatement());
        }
        if($event -> getType() == "afterQuery"){
            //在sql執(zhí)行完畢后停止分析
            $profiler -> stopProfile();
            //獲取分析結(jié)果
            $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"])
    );

    /* 注冊監(jiān)聽事件 */
    $connection->setEventsManager($eventsManager);

    return $connection;
});

通過代碼可以看到,不僅是底層SQL,還將SQL綁定的參數(shù)(PDO預(yù)處理)和SQL執(zhí)行時間也記錄到日志中了。日志記錄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預(yù)處理時綁定的參數(shù),最后的浮點(diǎn)數(shù)就是SQL執(zhí)行時間(單位為秒)。

創(chuàng)建模型

模型類的命名必須符合駝峰命名法,而且須繼承自 PhalconMvcModel 類:

// 文件路徑:app/frontend/models/ArticlesModel.php
class Articles extends MarserAppFrontendModelsBaseModel {
    // MarserAppFrontendModelsBaseModel繼承自 PhalconMvcModel 類。
    // 此處是再次封裝一個基礎(chǔ)模型類,  以方便后續(xù)的通用方法封裝
    //...
}
數(shù)據(jù)庫表映射

默認(rèn)情況下,Articles 模型類對應(yīng)的數(shù)據(jù)表名是 articles ;若是 ArticlesTags 模型類,則對應(yīng)的數(shù)據(jù)庫表名是 articles_tags , 即類名對應(yīng)著表名。如果想映射到其他數(shù)據(jù)庫表,可以使用 setSource() 方法設(shè)置:

// 文件路徑:app/frontend/models/ArticlesModel.php
class Articles extends MarserAppFrontendModelsBaseModel {
  public function initialize()
    {
        $this->setSource("articles_tags");
    }
}

在項(xiàng)目開發(fā)中,建議一個數(shù)據(jù)表對應(yīng)著一個模型類。即使是關(guān)聯(lián)表,也強(qiáng)烈建議創(chuàng)建其對應(yīng)的模型類,因?yàn)?Phalcon 中提供的連表操作,都是基于模型類的(后續(xù)的教程會分享)。

設(shè)置表前綴

在進(jìn)行數(shù)據(jù)庫表設(shè)計(jì)的時候,有時會在表名前加上一段前綴,如 test_articles 。我們依然可以通過 setSource() 映射數(shù)據(jù)表:

// 文件路徑:app/frontend/models/ArticlesModel.php
class Articles extends MarserAppFrontendModelsBaseModel {
  public function initialize()
    {
        $this->setSource("test_articles");
    }
}

假設(shè),我們的項(xiàng)目中有100張數(shù)據(jù)表,那么就意味著有100個模型類。此時我們在每個模型類中都必須調(diào)用 setSource() 來映射完整的表名。如果某天我們需要修改這100張表的前綴,那么將要修改這100個模型類,不僅耗時耗力還麻煩。我們嘗試著將此處理過程提取出來進(jìn)行封裝:

// 文件路徑: app/frontend/models/ArticlesModel.php
class ArticlesModel extends MarserAppFrontendModelsBaseModel {

    /**
     * 表名
     */
    const TABLE_NAME = "articles";

    public function initialize(){
        parent::initialize();
        //映射數(shù)據(jù)表(補(bǔ)上表前綴)
        $this->set_table_source(self::TABLE_NAME);
    }
}

BaseModel 模型基類中的 set_table_source() 方法定義如下:

// 文件路徑: app/frontend/models/BaseModel.php
class BaseModel extends PhalconMvcModel {

    public function initialize(){

    }

    /**
     * 映射數(shù)據(jù)表(補(bǔ)上表前綴)
     * @param string $tableName
     * @param null $prefix
     */
    protected function set_table_source($tableName, $prefix = null){
        //默認(rèn)從配置中讀取表前綴配置
        empty($prefix) && $prefix = $this->getDI()->get("config")->database->prefix;
        //拼接成完整表名之后,再通過setSource()映射數(shù)據(jù)表
        $this->setSource($prefix . $tableName);
    }
}

我們在每個模型類中定義一個 類常量 來存儲無前綴的表名,再通過 set_table_source() 成員方法來拼接表前綴并映射。眼尖的讀者,應(yīng)該在上面的數(shù)據(jù)庫連接信息配置中有看到 prefix 的表前綴配置。
還是以上面為例,此時我們就不需要修改100個模型類的代碼,而只需修改配置文件中的 prefix 配置即可。

以上代碼已托管在github:https://github.com/KevinJay/m...

最后,歡迎大家加入QQ群交流討論:

廣州PHP高端交流群:158587573

Phalcon玩家群:150237524

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/23021.html

相關(guān)文章

  • Phalcon入門教程目錄結(jié)構(gòu)

    摘要:原文發(fā)表于入門教程之目錄結(jié)構(gòu)很多初學(xué)的朋友,對于以框架為基礎(chǔ)構(gòu)建的項(xiàng)目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。只需要通過注冊這些目錄結(jié)構(gòu),即可正常使用。 原文發(fā)表于:Phalcon入門教程之目錄結(jié)構(gòu) 很多初學(xué)Phalcon的朋友,對于以Phalcon框架為基礎(chǔ)構(gòu)建的項(xiàng)目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。比如多模塊的項(xiàng)目中,如何共用libs類庫和models目錄中模型類的情況,就有很...

    reclay 評論0 收藏0
  • 我為什么要開發(fā)一個 MixPHP 框架

    摘要:異步隊(duì)列消費(fèi)者開發(fā)只提供了模式下運(yùn)行控制器方法,并未提供主進(jìn)程多子進(jìn)程的進(jìn)程模型,并未提供多線程處理。多線程異步隊(duì)列服務(wù)只需寫好控制器方法,然后在配置文件中配置下路由命名空間進(jìn)程線程數(shù)量,就可在模式中啟動多進(jìn)程多線程模型的異步隊(duì)列處理程序。 最近業(yè)余時間一直在開發(fā)ExpressPHP的第二個版本 MixPHP,今天下班想起之前一個面試官的問題:你為什么還要再造一個輪子呢?仔細(xì)回想,第一...

    SnaiLiu 評論0 收藏0
  • Phalcon模型

    摘要:使用模型模型表示應(yīng)用程序信息數(shù)據(jù)以及這些數(shù)據(jù)的處理規(guī)則,主要用于管理與對應(yīng)數(shù)據(jù)表的交互規(guī)則。應(yīng)用中,是所有模型的基類。創(chuàng)建模型模型需繼承類,以大駝峰格式命名。方法在請求期間只調(diào)用一次,目的是為該模型的所有實(shí)例執(zhí)行初始化操作。 使用模型(Working with Models) 模型表示應(yīng)用程序信息(數(shù)據(jù))以及這些數(shù)據(jù)的處理規(guī)則,主要用于管理與對應(yīng)數(shù)據(jù)表的交互規(guī)則。大多數(shù)情況下,數(shù)據(jù)庫中...

    chanjarster 評論0 收藏0
  • PHP-Phalcon框架中的數(shù)據(jù)庫操作

    摘要:本文描述了框架中數(shù)據(jù)庫操作方法,主要討論框架的組件中的操作方法。屬性方法在框架中支持屬性的擴(kuò)展查詢,在上例中,可以把條件語句改為同時省略查詢條件結(jié)果不變。 本文描述了PHP-Phalcon框架中數(shù)據(jù)庫操作方法,主要討論P(yáng)halcon框架的Model組件中的操作方法。更詳細(xì)的Model介紹請參考:官方文檔 1. 連接數(shù)據(jù)庫 在Phalcon框架中,通過在DI中注入db參數(shù)來實(shí)現(xiàn)數(shù)據(jù)庫的...

    xiaotianyi 評論0 收藏0
  • Phalcon入門教程安裝

    摘要:若在云服務(wù)器上安裝失敗或者卡住,可參考此博文云服務(wù)器編譯安裝失敗 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...

    BlackMass 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<