2014-01-16 1 views
1

У меня есть следующий код:Как повторить глубокий поиск Торт с ручной присоединяется

$current_user = $this->User->find('first', array(
    'recursive' => -1, 
    'conditions' => array('User.id' => $user_id), 
    'fields' => array(
     //User 
     'User.id', 
     //Profile 
     'Profile.user_id', 
     'Profile.id', 
     'Profile.first_name', 
     'Profile.last_name', 
     'Profile.media_asset_id', 
     //Profile Picture 
     'MediaAsset.id' 
    ), 
    'joins' => array(
     array(
      'table' => 'profiles', 
      'alias' => 'Profile', 
      'type' => 'left', 
      'conditions' => array(
       'Profile.user_id = User.id' 
      ) 
     ), 
     array(
      'table' => 'media_assets', 
      'alias' => 'MediaAsset', 
      'type' => 'left', 
      'conditions' => array(
       'MediaAsset.id = Profile.media_asset_id' 
      ) 
     ) 
    ) 
)); 

И стыки отлично работать, иначе, возвращая пользователя, профиль и MediaAsset. Однако, если я позволил Cake сделать это найти для меня это привело бы к этой структуре: (пример 1)

User 
Profile 
---- MediaAsset 

Однако руководство находит его, как следует: (пример 2)

User 
Profile 
MediaAsset 

Есть во всяком случае, не делая больше запросов, я могу получить его, похожий на Cake?

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

** Редактировать Чтобы уточнить, чего я пытаюсь достичь. В моей базе данных будет много таблиц, и многие из этих таблиц свяжутся с User. Однако я не хочу извлекать их всех, поскольку это пустая трата ресурсов. Из-за этого я указываю ручные объединения для запросов, которые я запускаю для каждого запроса, например текущего пользователя.

Проблема в том, что мне нужно получить MediaAsset в профиле, что отлично (см. Пример 2). Но приятное форматирование Cake дает больше смысла.

** Для scrowler Это найти результаты возвращаются все (Пользователь, профиль, Гараж, предпочтение, любая модель, которая имеет user_id)

if (!$username || !$user = $this->find('first', array(
     'conditions' => array('User.username' => $username), 
     'contain' => array(
      'Profile' 
     ) 
    ))) { 
    throw new NotFoundException('User not found'); 
} 
+1

Можете ли вы объяснить немного больше? – Anubhav

+0

@ Анубхав, написали править. Это помогает? – jshthornton

+1

Вы после вложенного массива для MediaAsset? Если это так, и вы не хотите использовать отношения модели Cake, я думаю, вам, возможно, придется написать его вручную ... например. 'foreach ($ current_user as $ key => $ user) {$ current_user [$ key] ['MediaAsset'] = $ this-> MediaAsset-> find ('all', array ('conditions' => array ('MediaAsset .id '=> $ user [' Profile '] [' media_asset_id ']))); } '- однако, поскольку Cake создан для создания подобных вещей для вас, не было бы лучше связать его с помощью ассоциаций моделей? –

ответ

0

в моем AppModel.php я есть:

public $actsAs = array('Containable'); 

, то в модели, где у меня есть метод найти:

$rs = $this->find('all', array(
     'recursive' => -1, 
     'order' => array('User.created DESC'), 
     'contain' => array(
      'Profile' => array(
       'MediaAsset' => array('fields' => array('id','profile_id' ....), 
       'fields' => array('id', 'created', ....)), 
     ), 
    )); 

все работы без каких-либо проблем, просто не забудьте добавить «рекурсивный» => -1 при использовании содержать.