Phalcon入門教程之模型

2021-09-16 22:04:40 字數 3390 閱讀 9400

原文發表於:

phalcon入門教程之模型

phalcon提供了四種方式操作mysql資料庫:模型、phql、資料庫抽象層以及原生sql。不論何種方式,首先都需要在di中註冊db服務才能正常使用:

$di -> setshared('db', function () use($config)

$connection = new \phalcon\db\adapter\pdo\mysql(array(

"host" => $dbconfig['host'], "port" => $dbconfig['port'],

"username" => $dbconfig['username'],

"password" => $dbconfig['password'],

"dbname" => $dbconfig['dbname'],

"charset" => $dbconfig['charset'])

);return $connection;

});

資料庫連線資訊配置如下:

return array(

//資料庫表配置

'database' => array(

//資料庫連線資訊

'db' => array(

'host' => '127.0.0.1',

'port' => 3306,

'username' => 'admin',

'password' => 'admin',

'dbname' => 'test',

'charset' => 'utf8',

),//表字首

'prefix' => 'test_',

),);在我們開發過程中,有時候需要通過sql語句來分析定位問題。那麼,我們需要將orm生成的底層sql記錄到日誌中。修改di中註冊的db服務如下:

$di -> setshared('db', function () use($config)

$eventsmanager = new \phalcon\events\manager();

// 分析底層sql效能,並記錄日誌

$profiler = new phalcon\db\profiler();

$eventsmanager -> attach('db', function ($event, $connection) use ($profiler)

if($event -> gettype() == 'afterquery') ");

}});

$connection = new \phalcon\db\adapter\pdo\mysql(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  0.034402132034302
花括號({})中的就是sql預處理時繫結的引數,最後的浮點數就是sql執行時間(單位為秒)。

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

// 此處是再次封裝乙個基礎模型類, 以方便後續的通用方法封裝

//...

}預設情況下,articles模型類對應的資料表名是articles;若是articlestags模型類,則對應的資料庫表名是articles_tags, 即類名對應著表名。如果想對映到其他資料庫表,可以使用setsource()方法設定:

public function initialize()

} 在專案開發中,建議乙個資料表對應著乙個模型類。即使是關聯表,也強烈建議建立其對應的模型類,因為phalcon中提供的連表操作,都是基於模型類的(後續的教程會分享)。

在進行資料庫表設計的時候,有時會在表名前加上一段字首,如test_articles。我們依然可以通過setsource()對映資料表:

public function initialize()

} 假設,我們的專案中有100張資料表,那麼就意味著有100個模型類。此時我們在每個模型類中都必須呼叫setsource()來對映完整的表名。如果某天我們需要修改這100張表的字首,那麼將要修改這100個模型類,不僅耗時耗力還麻煩。我們嘗試著將此處理過程提取出來進行封裝:

/*** 表名

*/const table_name = 'articles';

public function initialize()}

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

class basemodel extends \phalcon\mvc\model

/*** 對映資料表(補上表字首)

* @param string $tablename

* @param null $prefix

*/protected function set_table_source($tablename, $prefix = null)}

我們在每個模型類中定義乙個類常量來儲存無字首的表名,再通過set_table_source()成員方法來拼接表字首並對映。眼尖的讀者,應該在上面的資料庫連線資訊配置中有看到prefix的表字首配置。

還是以上面為例,此時我們就不需要修改100個模型類的**,而只需修改配置檔案中的prefix配置即可。

以上**已託管在github:

Phalcon入門教程之目錄結構

原文發表於 phalcon入門教程之目錄結構很多初學phalcon的朋友,對於以phalcon框架為基礎構建的專案,應該如何組織目錄結構有點摸不著頭腦。比如多模組的專案中,如何共用 libs 類庫和 models 目錄中模型類的情況,就有很多剛接觸phalcon朋友經常在群裡問這種問題。我們在翻閱p...

Phalcon入門教程之目錄結構

原文發表於 phalcon入門教程之目錄結構 很多初學phalcon的朋友,對於以phalcon框架為基礎構建的專案,應該如何組織目錄結構有點摸不著頭腦。比如多模組的專案中,如何共用 libs 類庫和 models 目錄中模型類的情況,就有很多剛接觸phalcon朋友經常在群裡問這種問題。我們在翻閱...

Phalcon入門教程之控制器

原文發表於 phalcon入門教程之控制器控制器在mvc分層中的主要作用是處理請求與響應。phalcon中的控制器類必須以 controller 為字尾,action則以 action 為字尾。phalcon mvc controller 是phalcon中控制器的基類,我們寫的控制器類通過繼承此基...