防止Doctrine在Symfony中使用查询缓存

8
在我的Symfony/Doctrine应用程序中,我有一个按RANDOM()排序的查询。我多次调用此方法,但看起来查询结果被缓存了。
以下是相关代码:
$query = $table->createQuery('p')
    ->select('p.*, RANDOM() as rnd')
    ->orderBy('rnd')
    ->limit(1)
    ->useQueryCache(null)
    ->useResultCache(null);
$result = $query->fetchOne();

不幸的是,每次都返回相同的记录,无论我是否将null传递给useQueryCacheuseResultCache。我尝试使用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

是的,我在我的问题中提到我尝试使用 false,但那也没有起作用。 - Matt Huggins
1
为什么要禁用查询缓存?查询语句本身并没有改变!你只需要清除结果缓存。也许是因为你的DBMS有缓存...你可以记录查询以查看每个请求是否都进行了查询。 - greg0ire
@greg0ire - 你说得对,我在这里的意图只是想证明我尝试过的一切都没有起作用。不过我会检查一下DBMS缓存,也许这就是为什么我每次都看到相同的记录返回的原因。 - Matt Huggins
我同意,检查生成的查询语句,因为RANDOM()可能每次都返回相同的结果。例如,如果将相同的种子提供给MySQL的RAND()函数,它将每次返回相同的值。 - rojoca
@Matt Gibson - 我编辑了问题,包括正在输出的SQL。您可以看到RANDOM()被正确调用。第一次调用时,它似乎被正确使用,因为选择了随机行;然而,每个后续调用都会返回相同的随机行。 - Matt Huggins
显示剩余2条评论
2个回答

5

原来我是个蠢货。我试图简化我的问题,但在这样做时,我没有捕捉到真正的原因。我使用了where()andWhere()函数,这些条件的组合导致只有一个可能匹配的记录。感谢大家抽出时间回答我的问题,很抱歉浪费了你们的时间!


4

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:添加此答案是因为我发现这个主题试图解决以上问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接