摘要:本文描述了框架中數據庫操作方法,主要討論框架的組件中的操作方法。屬性方法在框架中支持屬性的擴展查詢,在上例中,可以把條件語句改為同時省略查詢條件結果不變。
本文描述了PHP-Phalcon框架中數據庫操作方法,主要討論Phalcon框架的Model組件中的操作方法。更詳細的Model介紹請參考:官方文檔
在Phalcon框架中,通過在DI中注入db參數來實現數據庫的連接和配置,基本的配置方法如下:
use PhalconDbAdapterPdoMysql as DbAdapter; $di->set("db", function () { return new DbAdapter(array( "host" => "localhost", "username" => "root", "password" => "", "dbname" => "test" )); });
通過在$di中設置"db"的連接屬性,包括host,username,password,dbname等屬性來獲取數據庫參數,配置好db之后就可以利用Phalcon中的ORM框架了。
另一種通過配置文件的方法如下:
1.首先需要將數據信息寫入配置文件,在Phalcon中支持ini, php, json等三種配置文件形式,以下為ini形式的配置文件。
[database] adapter = Mysql host = localhost username = root password = dbname = test
2.利用配置文件將數據庫信息寫入DI
$di->set("db", function () use ($config) { $config = $config->get("database")->toArray(); $dbClass = "PhalconDbAdapterPdo" . $config["adapter"]; unset($config["adapter"]); return new $dbClass($config); });2. 建立數據庫表
在MySQL中建立數據庫表,如下所示:
CREATE TABLE `customer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `password` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以上語句建立了一個customer表,包括主鍵id,以及username和password兩個字段。
3. 創建模型根據上述數據庫表,創建Customer.php模型類,需要注意的是模型類必須繼承PhalconMVCModel類,并且采用與數據庫表名一致的駝峰命名法。因此建立如下的Customer類:
class Customer extends PhalconMvcModel { //采用默認的對應規則會自動映射數據庫表的字段,可以不寫 /** * * @var integer */ public $id; /** * * @var string */ public $username; /** * * @var string */ public $password; /** * Returns table name mapped in the model. * * @return string */ public function getSource() { return "customer"; } }
其實只要滿足了對應的命名規則,模型類中的屬性是不需要定義的,這里定義的目的是方便開發過程中查看,并且可以提高性能;此外,如果沒有采用數據庫表名對應的類名進行命名的話,就需要在初始化函數中通過setSource方法進行配置,配置代碼:
public function initialize() { $this->setSource("tablename"); }
從這里可以看出,在現代的Web開發框架中,都遵循約定大于配置(CoC)的基本原則。只要遵循約定,就可以很方便的進行Web開發。
4. 數據庫操作在Phalcon中操作數據庫提供了基本的ORM映射方式以及更加復雜的PHQL方式。ORM映射方式支持不寫SQL語句直接操作數據庫,基本上已經提供了絕大多數使用場景的支持;另一種更為高級的PHQL方式,支持編寫Phalcon化的SQL語句來操作數據庫。這里不編寫SQL語句,直接使用ORM映射本身提供的一切功能。
4.1 添加數據如果我想添加一條數據,最基本的方式演示如下:
新建一個控制器DatabaseController
在控制器中添加InsertAction
在InsertAction中寫入下列代碼:
public function insertAction() { $customer = new Customer(); $customer->username = "liyi"; $customer->password = "123456"; $ret = $customer->save(); if($ret){ print_r("插入成功"); } else { print_r("插入失敗"); } }4.2 查詢數據
1.find方法
Phalcon中提供了靜態方法find,采用find方法可以返回表中符合條件的所有數據:
public function findAction() { $customers = Customer::find(); $result = []; foreach ($customers as $customer) { $result[] = [ "username" => $customer->username, "password" => $customer->password, ]; } $this->response->setContentType("application/json", "UTF-8"); return $this->response->setJsonContent($result); }
調用
2.findFirst方法
Phalcon中的findFirst方法與find方法的使用方式幾乎無異,其區別在于findFirst方法的返回結果為單值,不需要通過foreach遍歷獲取每個值,在下面的代碼中演示了查詢數據庫表中username字段值等于"liyi"的記錄。
public function findfirstAction() { $customer = Customer::findFirst("username = "liyi""); $result = [ "username" => $customer->username, "password" => $customer->password, ]; $this->response->setContentType("application/json", "UTF-8"); return $this->response->setJsonContent($result); }
3.findBy<屬性>方法
在Phalcon框架中支持findBy<屬性>的擴展查詢,在上例中,可以把條件語句改為findFirstByUsername,同時省略查詢條件,結果不變。
$customer = Customer::findFirstByUsername("kirineko");
4.參數化查詢語句
如果需要查詢的內容較多,或者是從防止SQL注入的安全角度來考慮,應當使用參數化的查詢語句。比如如果需要從數據庫中查找username=(@用戶輸入的值)并且password=(@用戶輸入的值)的用戶,那么就應當使用參數化查詢。
下面模擬用戶登錄的過程,用戶輸入用戶名和密碼,然后系統在數據庫中進行查找,如果找到則返回歡迎頁,如果沒有找到,就提示錯誤信息。
public function loginAction() { $username = $this->request->getPost("username"); $password = $this->request->getPost("password"); $conditons = "username = :username: and password = :password:"; $parameters = [ "username" => $username, "password" => $password, ]; $ret = Customer::findFirst( [ $conditons, "bind" => $parameters, ]); if($ret){ print_r("login success"); } else { print_r("login failed"); } }4.3 更新數據
更新數據的方法通常是先查詢數據,如果能查到數據就對數據進行賦值,然后save即可?,F在要更新用戶名為kirineko的密碼為用戶指定的密碼,代碼如下:
public function updateAction() { $password = $this->request->getPost("password"); $newpassword = $this->request->getPost("newpassword"); $conditons = "username = :username: and password = :password:"; $parameters = [ "username" => "kirineko", "password" => $password, ]; $customer = Customer::findFirst([ $conditons, "bind" => $parameters, ]); if($customer){ $customer->password = $newpassword; $customer->save(); print_r("更新成功"); } else { print_r("用戶名不存在或密碼錯誤"); } }4.4 刪除數據
Phalcon的提供了delete命令用于刪除,現要刪除用戶名為liyi的數據,代碼如下:
public function deleteAction() { $customer = Customer::findFirstByUsername("liyi"); if($customer){ $res = $customer->delete(); if($res) { print_r("刪除成功"); } else { print_r("刪除失敗"); } } else { print_r("用戶不存在"); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30321.html
摘要:傳統的代碼中,在類中調用其他對象,都是自己出來一個對象,然后調用,這樣代碼的耦合度就比較高。日志對象和主程序的耦合度降到最低,即使更改日志對象的操作,主程序不受影響。 SSM框架網站后臺搭建(一) 1.所用技術簡單介紹 1.SSM中的S:Spring Spring在百度詞條上的解釋是: Spring是一個開放源代碼的設計層面框架,他解決的是業務邏輯層和其他各層的松耦合問題,因此它將面向...
摘要:中的事件的一個,我暫且理解為一個中的和這兩個屬性已經在框架中直接掛載在了對象上,歸功于曾老師。 CQRS是啥?DDD又是啥? 這兩個概念其實沒什么神秘的,當然此文章中的這兩個概念以曾老師的課程為準(關于CQRS和DDD的標準概念,google上已經很多了,不再贅述。) DDD(Domain Driven Design),領域驅動設計開發。 DDD和OOP有什么同嗎?其實就我個人經驗來說...
摘要:框架搭建首先下載相應的包,對于包有兩種方式使用創建依賴從而導入所需的包。總結主要進行頁面的請求接受與響應。組件包括前端控制器,處理器映射器,處理器適配器,視圖解析器,處理器,視圖。 我之前的文章介紹了如何搭建SSH框架以及如何利用這一框架來進行web應用開發,最近我又接觸了SSM框架即Spring+SpringMVC+Mybatis三大框架的整合,而且目前該框架就SSH框架而言使用的較...
摘要:近日它們交鋒的戰場就是動態計算圖,誰能在這場戰爭中取得優勢,誰就把握住了未來用戶的流向。所以動態框架對虛擬計算圖的構建速度有較高的要求。動態計算圖問題之一的多結構輸入問題的高效計 隨著深度學習的發展,深度學習框架之間競爭也日益激烈,新老框架紛紛各顯神通,想要在廣大DeepLearner的服務器上占據一席之地。近日它們交鋒的戰場就是動態計算圖,誰能在這場戰爭中取得優勢,誰就把握住了未來用戶的流...
閱讀 2571·2021-09-26 10:13
閱讀 5969·2021-09-08 10:46
閱讀 685·2019-08-30 15:53
閱讀 2957·2019-08-29 16:13
閱讀 2750·2019-08-26 12:23
閱讀 3478·2019-08-26 11:24
閱讀 1085·2019-08-23 18:09
閱讀 1028·2019-08-23 17:08