作者:老王
以下以CakePHP1.2为准。主要记录一些不常见的使用细节。
1.在hasAndBelongsToMany关系中的with参数。
以
CakePHP本身的一个
文件(db_acl.php)
源代码为例,我们看到在定义Aco、Aro时有如下的代码:
var $hasAndBelongsToMany = array('Aco' => array('with' => 'Permission'));
这里可以看到在
定义多对多关系的时候,使用了一个with参数,其含义可以通过model.php文件的源代码猜出来,用来定义多对多关系中关联表的名字。
2.在model若干方法里,conditions形参出现的“-!”符号的意思。
这个符号看上去有点奇怪,其实现可以参考dbo_source.php文件中的conditionKeysToString方法,大概功能是用来创建一些比较灵活的WHERE部分
SQL语句(不然SQL中的condition部分的
字段值会不管3721都给你加上单引号)。可以参考
链接一:
http://cakebaker.42dh.com/2007/05/04/how-to-use-sql-functions-in-conditions/
链接二:
http://cakebaker.42dh.com/2007/05/22/how-to-use-sql-functions-in-conditions-part-ii/
说起“-!”,还有一个小插曲,我以前一直想怎么能生成类似“UPDATE ... SET view = view + 1 ...”类型的SQL语句,还在irc上问过phpNut(CakePHP团队负责人),他就告诉我使用saveField('view', '-!view + 1'),实际这是行不通的,-!主要用户在WHERE语句部分的处理,而上面的SQL显然不符合要求,看来即使是CakePHP核心团队,也不是句句保准啊。
对于“UPDATE ... SET view = view + 1 ...”这个问题,或许目前也只能使用手写SQL的方法来实现了。
3.缺省使用跳转方法,不带有exit退出功能。
缺省使用redirect方法时,大概的代码可能如下:$this->redirect('controller/action');但是要注意的是这样是不带有必要的exit退出功能的,如果你想加上退出,必须这样:$this->redirect('controller/action', null, true);不管怎么说,这样有些别扭,应该缺省带有exit比较符合使用习惯,但是我猜想CakePHP也是出于兼容的考虑才这样做的,解决的方法很简单,我们可以自定义一个新的跳转方法,如下:
复制内容到剪贴板
代码:
class AppController extends Controller
{
// ...
function appRedirect($url, $status = null, $exit = true)
{
$this->redirect($url, $status, $exit);
}
}这样,我们在$this->appRedirect('controller/action');的时候,就会自动exit了。
4.如何使用CakePHP脚本做shell用?
最新的CakePHP版本中,我们已经看到多了一个console目录,它就是用来实现shell功能的,具体可以参考链接:
http://cakebaker.42dh.com/2007/05/16/shells-and-tasks/