CakePHP - Самая эффективная глубокая проверка

У меня очень глубокие ассоциации с Cake:

User
---- Garage
---- ---- Vehicle
---- ---- ---- VehicleAlbum

Как лучше всего проверить, принадлежит ли VehicleAlbum пользователю? Потому что выполнение рекурсивной 3 очень дорого. Я заглянул в контейнер, это лучшее решение?

Спасибо, Джош.


person jshthornton    schedule 14.01.2014    source источник


Ответы (2)


Не существует такой вещи, как рекурсивный 3 (см. Книгу).

Вы также не можете использовать Containable для ограничения результатов поиска на основе дочернего условия (см. Обоснование).

Я предполагаю, что вы захотите сделать что-то вроде этого (начиная с Garage, чтобы сократить один необходимый запрос, поскольку он имеет идентификатор пользователя в качестве поля):

$this->Garage->find('all', array(
    'conditions' => array(
        'Garage.user_id' => $userId
    ),
    'joins' => array(
        array(
            'table' => 'vehicles',
            'alias' => 'Vehicle',
            'type' => 'inner',
            'conditions' => array(
                'Vehicle.garage_id = Garage.id'
            )
        ),
        array(
            'table' => 'vehicle_albums',
            'alias' => 'VehicleAlbum',
            'type' => 'inner',
            'conditions' => array(
                'VehicleAlbum.vehicle_id = Vehicle.id',
                'VehicleAlbum.id' => $vehicleAlbumId
            )
        )
    )
));

Должен возвращать результат (ы), если он принадлежит владельцу, или пустой, если нет.

person Dave    schedule 14.01.2014

Нет, это не будет дорого до тех пор, пока вы не сделаете неправильный запрос. Итак, напишите запрос, объедините все четыре таблицы и запустите объяснение ... затем проверьте, дорого это или дешево. Еще одна вещь в вашем случае, если эти таблицы связаны, как показано выше, тогда вы должны заплатить за запрос соединения, нет другого выхода, кроме изменения ваших отношений между таблицами.

person Anubhav    schedule 14.01.2014