Соединения для сдерживания создаются лениво
Если предложение join
пусто, то вы, вероятно, используете ie контейнеры contain()
, *joinWith()
, matching()
и / или notMatching()
методы.
Объединения включений будут добавлены в предложение join
объекта запроса только при компиляции запроса, до тех пор они живут в нетерпеливом загрузчике, а их обратные вызовы построителя запросов еще не оценен. Итак, хотя вы можете получить их так:
// contain()
$contain = $query->getEagerLoader()->getContain();
// *joinWith()/matching()/notMatching()
$matching = $query->getEagerLoader()->getMatching();
, условия еще нигде не применялись.
Получение привязок
При этом, если вы хотите хотел оценить весь запрос, тогда вы могли бы получить доступ к связанным значениям через связыватель значений, например:
$sql = $query->sql();
$bindings = $query->getValueBinder()->bindings();
Создание ключей кеша в средствах поиска
Один из подходов, который вы, возможно, захотите рассмотреть, - частичное смещение ответственности за ключ кеша на средство поиска, ie создание ключей кеша в средствах поиска, где у вас есть вся необходимая информация под рукой, и установка их в объекте запроса для оценки / использования в других местах.
Это могло бы выглядеть примерно так:
public function findVeryComplicatedFinder(\Cake\ORM\Query $query)
{
$cacheKey = '';
if ($abc) {
$cacheKey .= 'abc';
$query->leftJoinWith('Abc', function () {
// ...
});
}
if ($xyz) {
$cacheKey .= 'xyz';
$query->innerJoinWith('Xyz', function () {
// ...
});
}
// ...
$query->applyOptions([
'veryComplicatedFinderCacheKey' => $cacheKey
]);
return $query;
}
В обратном вызове cache()
вашего основного объекта запроса вы могли затем прочитать эту опцию и использовать ее для создания окончательного ключа кеша, что-то вроде этого:
$query = $this->Regions
->find('veryComplicatedFinder')
->cache(
function (\Cake\ORM\Query $query) {
$options = $query->getOptions();
$cacheKey =
'mainQueryCachKeyBasedOnWhateverYouRequire' .
$options['veryComplicatedFinderCacheKey'];
return $cacheKey;
},
'queries'
);