我从一个实体(销售)中删除了一个属性(预告片)。我使用 CLi 更新数据库和实体:
$ php app/console doctrine:schema:update --complete --force
$ php app/console doctrine:generate:entities Our --no-backup
$ php app/console doctrine:cache:clear-metadata
$ php app/console doctrine:cache:clear-result
我清除了缓存:
$ php app/console cache:clear --no-optional-warmers --no-warmup
现在我有一个由查询生成器创建的查询:
$qb = $this->createQueryBuilder('s');
$q = $qb
->select('s.id')
->leftJoin('s.bills','b')
->where('b.paid = true')
->getQuery()
->getResult();
这会引发错误,因为它会生成一个包含旧属性的 select 语句:
Column not found: 1054 Unknown column 's0_.teaser' in 'field list'
我试图了解 Doctrine 如何执行查询,但未能找到问题的根源。有没有人有任何线索?
更新:我从查询中获取 DQL,由 querybuilder 生成,然后用它来创建一个新的查询。同样的错误。然后我将 DQL 中的一个单词从大写更改为小写(LEFT现在是Left)并且那个执行得很好。
$q = $this->getEntityManager()
->createQuery('SELECT s,b FROM Our\BuyBundle\Entity\Sale s Left JOIN s.bills b WHERE s.id IN (:randomIds)')
->setParameter('randomIds', $allSaleIds);
所以看起来 DQL 语句被缓存在某个地方,使用 DQL 作为哈希来获取相应的 SQL 语句。我仍然无法弄清楚在哪里以及如何清除缓存的信息。特别是考虑到我也删除了 app/cache 文件夹中的所有内容。
UPDATE2:找到解决方案。必须手动清除 APC 缓存,因为控制台不能这样做。所以解决方案是:
$ php app/console doctrine:cache:clear-query
如果这不起作用,请清除您的 APC 缓存。