Doctrine 2.5: Unrecognized field (but only in Symfony's prod mode)

Viewed 3079

So I seem to be plagued by issues that only affect production mode in Symfony and not developer mode. This time, I have a ManyToOne association and I'm trying to fetch only the entities which do not have an association (i.e. they have a NULL value in the database). This works exactly as I'd expect in dev move, but in prod mode, Doctrine throws an "unrecognized field" exception... for a field which absolutely does exist.

Here's the relevant part of the entity in question (Page.php):

/**
 * @ORM\ManyToOne(targetEntity="Project", inversedBy="pages")
 * @ORM\JoinColumn(name="project_id", referencedColumnName="ID")
 */
protected $project;

And here is the relevant line from the controller (PageController.php):

$pages = $this->getDoctrine()->getRepository('JCScopingBundle:Page')->findBy(['project' => null]);

Again, this works perfectly using app_dev.php (i.e. dev mode), but using app.php (i.e. prod mode) I keep getting the "unrecognized field" exception. What gives?

Update: I added a "weight" integer field to the same entity and that field is not recognized in prod mode either. This means I can't use prod mode, which means I can't upload my changes to the remote server. Really in a pickle here...

2 Answers

Well, low and behold, restarting the Apache service resolved the issue. Apparently that's the only way to truly clear the APCu metadata cache. I was inspired to try this based on this question/answer: Doctrine mapped field is not working

In my case I forgot to restart 'memcached' service.

Check metadata_cache_driver type. In my case:

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

Because previous metadata was cached, after applying migration, doctrine used that old cached metadata, without knowing about added new field.

Related