原则2.5:未识别字段(但仅在Symfony的prod模式下)

原则2.5:未识别字段(但仅在Symfony的prod模式下),symfony,doctrine-orm,doctrine,Symfony,Doctrine Orm,Doctrine,所以我似乎被一些问题困扰着,这些问题只会影响Symfony中的生产模式,而不会影响开发人员模式。这一次,我有一个manytone关联,我试图只获取没有关联的实体,即它们在数据库中有一个空值。这和我在devmove中预期的完全一样,但在prod模式下,条令抛出一个无法识别的字段异常。。。对于一个绝对存在的字段 下面是Page.php中实体的相关部分: /** * @ORM\ManyToOne(targetEntity="Project", inversedBy="pages") * @ORM\

所以我似乎被一些问题困扰着,这些问题只会影响Symfony中的生产模式,而不会影响开发人员模式。这一次,我有一个manytone关联,我试图只获取没有关联的实体,即它们在数据库中有一个空值。这和我在devmove中预期的完全一样,但在prod模式下,条令抛出一个无法识别的字段异常。。。对于一个绝对存在的字段

下面是Page.php中实体的相关部分:

/**
 * @ORM\ManyToOne(targetEntity="Project", inversedBy="pages")
 * @ORM\JoinColumn(name="project_id", referencedColumnName="ID")
 */
protected $project;
下面是controller PageController.php中的相关行:

$pages = $this->getDoctrine()->getRepository('JCScopingBundle:Page')->findBy(['project' => null]);
同样,这在使用app_dev.php即dev模式时非常有效,但在使用app.php即prod模式时,我会不断得到无法识别的字段异常。有什么好处


更新:我向同一实体添加了一个权重整数字段,该字段在prod模式下也无法识别。这意味着我不能使用prod模式,这意味着我不能将更改上载到远程服务器。这里真的很麻烦…

就我而言,我忘了重新启动“memcached”服务

检查元数据\缓存\驱动程序类型。就我而言:

doctrine:
    orm:
        metadata_cache_driver:
            type: memcached
            host: localhost
            port: 11211
            instance_class: Memcached

因为以前的元数据是缓存的,所以在应用迁移之后,doctrine使用了旧的缓存元数据,而不知道添加的新字段。

好吧,很低,重新启动Apache服务解决了这个问题。显然,这是真正清除APCu元数据缓存的唯一方法。基于这个问题/答案,我受到了启发,尝试了这个方法:

如果某个东西在开发环境中工作,而不是在prod中,那么它大部分时间都在缓存中。是否缓存:clear-env=prod-无调试?老实说,在我的本地计算机上,通过GUI文件系统删除prod cache文件夹,然后重新加载页面通常比较容易。我已经不止一次这样做了,并且得到了同样的结果。上一次我只有一个prod的问题是Symfony中的一个bug,最终被官方补丁修复了。我刚刚尝试了命令行方法,得到了相同的结果。你能发布Symfony抛出的准确、完整的错误吗?另外:自定义查询也会发生这种情况吗?例如,CreateQuerySelectPagefromJCScopingBundle:PagePage其中p.project为NULL?request.CRITICAL:Uncaught PHP Exception-Doctrine\ORM\orException:Unrecogned字段:project at..\vendor\Doctrine\ORM\lib\Doctrine\ORM\orException.PHP第101行{Exception:[对象]条令\\ORM\\ORMException代码:0:无法识别的字段:项目地址..\\vendor\\Doctrine\\ORM\\lib\\Doctrine\\ORM\\ORMException.php:101}我对每个缓存驱动程序使用APCu,但是我在过去应用迁移后没有遇到过这个问题。注释掉元数据缓存驱动程序行并再次清除prod缓存确实会导致页面加载没有错误,但是我找不到正确的CLI命令来清除Doctrine元数据缓存,这给了我一个错误,即使我将prod指定为环境,也找不到提供程序。好的Doctrine:cache:clear metadata似乎是正确的命令,但在使用它并清除prod缓存后,我仍然会收到错误。