- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我找不到在 Doctrine 中设置默认水化器的方法。它应该可用。对吧?
上面的文档页面解释了如何创建自定义水化器。这里的缺点是每次执行查询时都需要“指定”水化器。
最佳答案
我通过阅读 Chris Gutierrez 的评论并更改了一些东西来解决这个问题。
首先,为 Doctrine_Query 定义一个扩展类。扩展构造函数以定义您自己的水合模式。
class App_Doctrine_Query extends Doctrine_Query
{
public function __construct(Doctrine_Connection $connection = null,
Doctrine_Hydrator_Abstract $hydrator = null)
{
parent::__construct($connection, $hydrator);
if ($hydrator === null) {
$this->setHydrationMode(Doctrine::HYDRATE_ARRAY); // I use this one the most
}
}
}
然后,在您的 Bootstrap 中,将您的新类(class)告诉 Doctrine。
Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_QUERY_CLASS, 'App_Doctrine_Query');
Chris Gutierrez 为连接而不是全局定义了属性,但我有多个连接,我想对所有连接使用此默认值。
现在您不必在每次构建查询时都调用 Doctrine_Query::setHydrationMode()。
这里有更多信息
http://www.doctrine-project.org/projects/orm/1.2/docs/manual/configuration/en#configure-query-class
编辑:以下更改
我发现了上面的问题。具体来说,执行类似“Doctrine_Core::getTable('Model')->find(1)”的操作将始终返回一个水化数组,而不是一个对象。所以我对此做了一些改动,定义了用于查询调用的自定义执行方法。
另外,我添加了内存释放代码。
class App_Doctrine_Query extends Doctrine_Query
{
public function rows($params = array(), $hydrationMode = null)
{
if ($hydrationMode === null)
$hydrationMode = Doctrine_Core::HYDRATE_ARRAY;
$results = parent::execute($params, $hydrationMode);
$this->free(true);
return $results;
}
public function row($params = array(), $hydrationMode = null)
{
if ($hydrationMode === null)
$hydrationMode = Doctrine_Core::HYDRATE_ARRAY;
$results = parent::fetchOne($params, $hydrationMode);
$this->free(true);
return $results;
}
}
关于php - 如何在 Doctrine 中设置默认水化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2064488/
如果我运行类似于以下的查询: SELECT * FROM user u LEFT JOIN orders o ON o.user_id=u.id LEFT JOIN payments p ON p.o
我是一名优秀的程序员,十分优秀!