Doctrine2 无法更改映射关系。
有时候数据库中的字段类型更改了,同时在zend中的entity里也更改了映射关系,但是无论如何都不会生效。甚至你将这个字段的值改成任意值都可以用
初步感觉是缓存的原因,在网上查到了这样一篇文章Doctrine Annotations里面有一段话
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\CachedReader;
use Doctrine\Common\Cache\ApcCache;
$reader = new CachedReader(
new AnnotationReader(),
new ApcCache(),
$debug = true
);```
The debug flag is used here as well to invalidate the cache files when the PHP class with annotations changed and should be used during development.
英语不好,大概意思就是:这里有一个debug标志位,可以设置当php的annotations(注解)改变的时候清除缓存,应该在开发期间使用。
下面还有一句话对上述代码做了更详细介绍
The AnnotationReader works and caches under the assumption that all annotations of a doc-block are processed at once. That means that annotation classes that do not exist and aren’t loaded and cannot be autoloaded (using the AnnotationRegistry) would never be visible and not accessible if a cache is used unless the cache is cleared and the annotations requested again, this time with all annotations defined.
大概意思:AnnotationReader是被作为高速缓存的。一般来说注解只解释一次(这也造成了为什么运行一次之后更改注解无法生效的原因)。除非缓存被清除并且再次请求了注解才会生效(这句翻译可能有误)。
所以解决思路就很明显了,把Doctrine2设置为调试模式。这里我的项目entityManager是用代码创建的,不是用注解,主要是为了数据查询和逻辑代码分离。
public static function getMySQLEntityManager(){
$isDevMode = true;//重点在这里
$config = Setup::createAnnotationMetadataConfiguration(
array(__DIR__ . "/../Entity"),
$isDevMode, null, null, true);
$conn = array(
'host' => 'host',
'driver' => 'pdo_mysql',
'user' => 'user',
'password' => 'password',
'dbname' => 'name', );
return EntityManager::create($conn, $config);}
这段代码创建了一个entityManager对象。Setup::createAnnotationMetadataConfiguration
这个方法的第二个参数$isDevMode
将这个参数设置为true就可以开启调试模式了。更改过注解之后立即即可生效。如果在ini文件中写的配置应该也是有办法开启调试模式的,请自己搜索解决。