2014-01-14 2 views
1

У меня есть очень глубокая связь в Cake:CakePHP - Самая эффективная глубокая проверка

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

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

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

ответ

2

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

Вы также можете использовать Контейнер, чтобы ограничить результаты поиска на основе детского состояния (see reasoning).

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

$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 
      ) 
     ) 
    ) 
)); 

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

0

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

Смежные вопросы