在原始PHP中我会这样做:
$sth = $dbh->prepare("SELECT * FROM tags WHERE tag=:tag");
foreach ( $tags as $tag ) {
$sth->bindValue(':tag', $tag);
$sth->execute(); // followed by fetch, etc.
}
在CakePHP中,我必须使用本机find()
函数:
foreach ( $tags as $tag ) {
$this->Tag->find('first', array(
'conditions' => array(
'tag' => $tag,
),
));
}
我很确定这会导致CakePHP触发一组不会使用the benefits of having the prepared statement in place的单独数据库查询。
有没有办法可以强制CakePHP在不修改核心的情况下做到这一点?
更新 There is a way to call $this->getDataSource()
directly但是我正在寻找一种方法来继续使用find()
方法,如果可能的话,因为它handles contains automatically和那些代码complex queries using joins这一切看起来都更加优雅。
答案 0 :(得分:1)
您需要创建自定义/扩展数据源和/或自定义连接类,或者实现适当的缓存机制。
在数据源级别,您必须重新实施DboSource::_execute()
。在连接级别,您必须覆盖PDO::prepare()
。
看看DboSource::_execute()
当前做了什么:
<强> https://github.com/cakephp/.../blob/2.7.9/lib/Cake/Model/Datasource/DboSource.php#L448 强>
每次调用它时都会创建一个新语句,并且在不重新实现整个方法的情况下挂钩的唯一方法是使用自定义连接($this->_connection
)。
但是,为了能够使用自定义连接类,您必须重新实现connect()
方法(由各个DBO驱动程序类实现),这些方法并非如此。好的事情要做。
<强> https://github.com/cakephp/.../blob/2.7.9/lib/Cake/Model/Datasource/Database/Mysql.php#L152 强>
答案 1 :(得分:1)
Cake正在为DboSource课程做你想做的事。