phalcon-入門篇8(Model層基礎使用2)
phalcon-入門篇8(Model層基礎使用2)
本教程基於phalcon2.0.9版本
先在這裡感謝各位phalcon技術愛好者,我們提供這樣一個優秀的交流平臺
在上一節我們已經介紹了,phalcon-Model層的配置和最簡單的CURD的使用,那麼你認為這樣就完了?phalcon當然不會讓你失望,今天跟著筆者一同來看phalcon還有那些新奇的使用方式,在上一篇我們僅僅只是建立了一個空的model層,這裡今天也會對model的簡單使用封裝,函式今天一些說明,希望大家喜歡~
注:筆者水平有限,說的不正確的地方希望大家多多指正,一同交流技術
附上:
喵了個咪的部落格:http://w-blog.cn
教程程式碼庫:http://git.oschina.net/wenzhenxi/Phalcon-tutorial
phalcon官網地址:https://phalconphp.com
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 歡迎大家的加入!