在我的Symfony / Doctrine应用程序中,我有一个按RANDOM()命令的查询。我多次调用同一个方法,但看起来查询的结果正在被缓存。
这是我的相关代码:
$query = $table->createQuery('p')
->select('p.*, RANDOM() as rnd')
->orderBy('rnd')
->limit(1)
->useQueryCache(null)
->useResultCache(null);
$result = $query->fetchOne();
不幸的是,无论我将null
传递给useQueryCache
和useResultCache
,每次都会返回相同的记录。我尝试使用false
代替null
,但这也不起作用。最后,我还尝试同时调用setResultCacheLifeSpan(0)
和setResultCacheLifeSpan(-1)
,但这两种调用都没有区别。
有关如何防止缓存的任何见解,因为我希望每次调用此方法时都选择不同的随机行?
编辑:我也尝试过调用clearResultCache()
,但最终导致错误说明:“结果缓存驱动程序未初始化”。
编辑2:根据要求,这是通过调用$query->getSqlQuery()
生成的SQL:
SELECT c.id AS c__id, c.name AS c__name, c.image_url AS c__image_url,
c.level AS c__level, c.created_at AS c__created_at, c.updated_at
AS c__updated_at, RANDOM() AS c__0 FROM cards c ORDER BY c__0 LIMIT 1
答案 0 :(得分:4)
事实证明我是个白痴。我试图简化我对这个问题的查询,并且这样做,我没有捕捉到真正的原因。我进行了where()
和andWhere()
通话,条件组合只会导致匹配一条可能的记录。感谢您抽出宝贵时间回复,大家都很抱歉浪费您的时间!
答案 1 :(得分:3)
Doctrine还会缓存您在同一个请求/脚本运行中创建的实体。
例如:
$order = new Order();
$order->save();
sleep(10); // Edit this record in de DB in another procces.
$q = new Doctrine_Query();
$result = $q->select()
->from('Order o')
->where('o.id = '.$order->id);
$order = $result->getFirst();
print_r($order->toArray());
print_r不包含您在睡眠期间所做的更改。
以下代码将删除那种内存缓存:
$manager = Doctrine_Manager::getInstance();
$connection = $manager->getCurrentConnection();
$tables = $connection->getTables();
foreach ( $tables as $table ) {
$table->clear();
}
PS:添加了这个答案,因为我发现这个主题试图解决上述问题。