Этот вопрос не имеет отношения к БТР.
Вам нужно решить, как данные будут храниться в APC (или любом другом хранилище). Если вы хотите обновить значение ключа в APC, когда объект будет изменен - это возможно, только когда Object будет знать ключ (хэш запроса) и этот объект сможет собирать все данные из других объектов, извлеченных этот запрос. Все это звучит как абсурдная идея.
Любая модель должна быть разработана с принципом единой ответственности, поэтому, если вы хотите кэшировать целые объекты (это тоже не очень хорошая идея), то создайте уникальные ключи для каждого объекта.
Кроме того, объекты не должны заботиться о том, как они будут храниться (кэшироваться) и где. Итак, вам нужен еще один объект, который будет управлять кэшированием объектов.
И я рекомендую кешировать не целые объекты, а только значения записей в БД, что занимает много времени для их извлечения из БД.
Но если вы все еще хотите использовать хеш SQL-запроса в качестве ключа, тогда вы можете использовать теги и записывать «имена» объектов в эти теги.
Например, если в результирующем наборе у вас есть объекты Person, Employer и Customer, то ключ будет иметь теги «person», «Employer» и «Customer». И, когда объект Customer будет изменен, вы можете удалить из кеша все ключи, которые помечены тегом «customer».
Но, в любом случае, это не ответственность объекта Customer, все это должно управляться другим объектом.
Вопрос отредактирован, поэтому я тоже отредактирую свой ответ:)
Теги не являются частью APC, являются частью оболочки. Теги - очень полезная вещь и очень удобная для вашего случая.
которые содержат ссылку на обновленный объект
Теги могут быть этой ссылкой. Вам не нужно искать ключи по тегу, вам нужно просто удалить все ключи, связанные с этим тегом (чтобы данные оставались актуальными), и у этой оболочки есть существующий метод для этого.
В примерах:
Пусть у нас есть запрос SELECT * FROM persons WHERE email <> ''
- кэшированный результат этого запроса будет помечен тегом «персона».
Итак, когда мы обновим любой объект Person, мы удалим все ключи, помеченные тегом «person», поэтому наш результат для запроса SELECT * FROM persons WHERE email <> ''
будет удален, и в следующем запросе наш скрипт сгенерирует новый ( фактическое) значение.