#phalcon-入門篇8(Model層基礎使用2)#php
本教程基於phalcon2.0.9版本git
##前言## 先在這裏感謝各位phalcon技術愛好者,咱們提供這樣一個優秀的交流平臺數據庫
在上一節咱們已經介紹了,phalcon-Model層的配置和最簡單的CURD的使用,那麼你認爲這樣就完了?phalcon固然不會讓你失望,今天跟着筆者一同來看phalcon還有那些新奇的使用方式,在上一篇咱們僅僅只是創建了一個空的model層,這裏今天也會對model的簡單使用封裝,函數今天一些說明,但願你們喜歡~數組
注:筆者水平有限,說的不正確的地方但願你們多多指正,一同交流技術函數
附上:this
喵了個咪的博客:http://w-blog.cn.net
教程代碼庫:http://git.oschina.net/wenzhenxi/Phalcon-tutorialcode
phalcon官網地址:https://phalconphp.comorm
phalcon中文社區:http://www.iphalcon.cn/對象
##1. 更多查詢方式##
在這裏介紹的主要是一些查詢方面的各類操做,好比你們熟知的對象方式->執行查詢,條件替換等等操做,咱們仍是在Basemodel控制器中進行使用,咱們創建一個queryAction方法以供使用:
###1.1 連貫操做###
熟知TP或者是PhalApi的童鞋都知道里面都是採用了對象式的連貫操做:
$User->order('create_time')->limit(10)->where('status=1')->select();
或
DI()->notorm->user->where('id', 1)->update($data);
這樣的操做已經深刻人心,phalcon固然也有提供這樣的操做:
$rs = User::query() ->where("name = :name:") ->andWhere("phone = 13011111111") ->bind(array("name" => "phalcon")) ->order("phone") ->execute(); foreach ($rs as $user) { echo $user->name, "\n"; echo '</br>'; }
###1.2 條件替換###
其實在不少時候咱們都會用到條件替換,尤爲是在分頁的時候limit參數會根據獲取的頁碼改變,在上面連貫操做的時候已經有用到替換參數了:
->where("name = :name:") ->bind(array("name" => "phalcon"))
1.關鍵字是bind咱們來看一下其餘的使用方式:
$conditions = "name = ?1 AND phone = ?2"; $parameters = array(1 => "phalcon", 2 => "13011111111"); $rs = user::find( array( $conditions, "bind" => $parameters ) );
2.固然也能夠混合使用:
$conditions = "name = :name: AND phone = ?1"; $parameters = array( "name" => "phalcon", 1 => "13011111111" ); $rs = User::find( array( $conditions, "bind" => $parameters ) );
3.還能夠根據數組下標替換:
$rs = User::find( array( "name = ?0", "bind" => ["phalcon"], ) );
4.替換操做還有一種狀況我須要IN一組數據要怎麼替換進去呢:
$array = array('phalcon','phalcon2'); $rs = User::find( array( 'name IN ({letter:array})', 'bind' => array( 'letter' => $array ) ) );
注意:這裏傳入的數組下標必需要按照順序
###1.3 count,sum,average,max,min###
咱們在不少時候都會用到上面這些數據庫操做函數,咱們來簡單過一過他們的用法
一共有多少用戶
$count = User::count(); echo '</br>' . $count;
一共有多少個名字叫phalcon的
$count = User::count(array( "name = ?0", "bind" => array('phalcon') )); echo '</br>' . $count;
名字不一樣的人有幾種
$count = User::count(array( "distinct" => "name" )); echo '</br>' . $count;
電話號碼的和是多少
$sum = User::sum(array( "column" => "phone" )); echo '</br>' . $sum;
名字是phalcon的
$sum = User::sum( array( "column" => "phone", "conditions" => "name = 'phalcon'" ) ); echo '</br>' . $sum;
電話號碼平均值
$average = User::average( array( "column" => "phone" ) ); echo '</br>' . $average;
最大的電話號碼
$max = User::maximum( array( "column" => "phone" ) ); echo '</br>' . $max;
最小的電話號碼
$min = User::minimum( array( "column" => "phone" ) ); echo '</br>' . $min;
##2. 封裝Model層和函數##
瞭解封裝的童鞋都知道,封裝是爲了經過制定的get/set方法作該作的事情,那麼在這裏咱們結合着封裝和函數來一塊兒說說model層的一些基礎使用
###2.1 model函數###
咱們已經創建了User.php這個model類,咱們在把這個類複製一份名字爲Developer.php,爲何叫作Developer呢?好比有這樣一個場景有一個開發者對咱們來講是用戶,原來的童鞋把表名設成User表了,爲了更貼切咱們把model層叫作Developer可是須要指向到User表要怎麼作呢?
默認狀況下,模型 「User」 對應的是數據庫表 「user」, 若是想映射到其餘數據庫表,可使用 getSource() 方法:
class Developer extends Model { public function getSource() { return "user"; } }
模型 Developer 如今映射到了 「user」 表。
initialize() 方法能夠幫助在模型中創建自定義行爲,例如指定不一樣的數據庫表。 initialize() 方法在請求期間只被調用一次。這樣也能達到同樣的效果
public function initialize() { $this->setSource("the_robots"); }
若是須要爲每個實例在建立的時候單獨進行初始化,可使用 ‘onConstruct’ 事件:
public function onConstruct() { //須要作的事情 }
###2.2 封裝###
咱們在Developer.php作以下操做
咱們把原有的public的變量改成以下形式:
protected $id; protected $name; protected $phone; protected $passwd;
咱們在加入以下get/set方法:
public function getId() { return $this->id; } public function setName($name) { if (strlen($name) < 10) { throw new \InvalidArgumentException('The name is too short'); } $this->name = $name; } public function getName() { return $this->name; } public function setPhone($phone) { if (strlen($phone) != 11) { throw new \InvalidArgumentException('用戶電話號碼不足11位或超過'); } $this->phone = $phone; } public function getPhone() { return (double) $this->phone; } public function setPasswd($passwd) { if (strlen($passwd) <= 5) { throw new \InvalidArgumentException('用戶密碼長度不足5位'); } $this->passwd = $passwd; } public function getPasswd() { return $this->passwd; }
你們能夠看到,原來的public的變量已經被改爲了protected當咱們在使用原來的:
//設置須要寫入的數據 $User->name = "phalcon"; $User->phone = "13011111111"; $User->passwd = "passwd";
須要改爲:
//設置須要寫入的數據 $User->getName("phalcon"); $User->setPhone("13011111111"); $User->setPasswd("passwd");
當咱們在使用方法來寫入數據的時候就會經過咱們在model層寫好的驗證機制當傳入的值並非咱們須要的參數咱們就能及時作出反應
固然在咱們獲取參數原來的$rs->name也須要改成$rs->getName();
##3. 小結##
今天的教程就到這裏了,那麼你們有沒有GET到呢,phalcon-Model的內容很是多,在入門篇裏面只經過這兩篇Model教程來簡單瞭解model後面更深刻的模型關係,過濾,多庫操做,記錄SQL語句會在後面的章節一一舉例說明,多謝你們的支持,今天的教程就到這裏!
注:筆者能力有限有說的不對的地方但願你們可以指出,也但願多多交流!
Phalcon技術交流:364520707 PhalCon中文社區:287484785 歡迎你們的加入!