2010-10-28 2 views
2

в основном я следующие модели в CakePHP:hasMany сводится к hasOne в CakePHP

пользователя (идентификатор, имя пользователь) Фото (идентификатор, user_id, путь)

я установил следующее соотношение: Пользователь hasMany Фото ,

сейчас, на одном экране, я хотел бы указать пользователей и показать случайное фото рядом с каждым пользователем. я попытался создать следующие соотношения:

Пользователь hasOne SamplePhoto (где SamplePhoto только Фотомодель)

но когда пользователь имеет две фотографии, например, он в списке дважды в списке.

В основном мой вопрос: можете ли вы уменьшить hasMany отношение к hasOne, без добавления каких-либо полей в схему таблицы, представленную выше? я хотел бы сказать, что торт - найти первую запись в таблице фотографий, которая соответствует witch определенной user_id.

ответ

0

Вы бы сделать что-то вроде:

$user = $this->User->find('first', array('conditions' => 
       array('username'=>$this->data['User']['username'], 
         'active'=>true))); 
+0

Найдет первый пользователь – Leo

2

если вы находку как $ this-> User-> прочитать (NULL, $ ID), возвращение будет массив, который выглядит примерно так:

Array 
(
    [User] => Array 
     (
      [id] => 121 
      [username] => tom 
     ) 

    [Photo] => Array 
     (
      [0] => Array 
       (
        [id] => 123 
        [user_id] => 121 
        [path] => Somewhere 
       ) 
      [1] => Array 
       (
        [id] => 124 
        [user_id] => 121 
        [path] => SomeOtherPlace 
       ) 
     )    
) 

Из этого массива вы можете выбрать фотографию, как вам нравится, будь то первый:

$this->data['Photo'][0] 

последнее:

$this->data['Photo'][count($this->data['Photo'])] 

явная запись:

$this->data['Photo'][3] 

или некоторые случайные средства:

$this->data['Photo'][$rnd] 
2

Не сделать это гораздо сложнее, чем это должно быть. :)

$data = $this->User->Photo->find('first', 
     array('conditions' => array('Photo.user_id' => $id))); 

дает вам фото в $data['Photo'] с пользователем присоединенным в $data['User'].

3

Вы также можете использовать Containable behaviour, а затем создать что-то вроде:

$this->User->find(
    'all', 
    array(
     'contains' => array(
      'Photo' => array(
       'order' => 'rand()', 
       'limit' => 1 
      ) 
     ) 
    ) 
); 

тогда Вы должны получить что-то вроде

Array 
(
[User] => Array 
    (
     [id] => 121 
     [username] => tom 
    ) 

[Photo] => Array 
    (
     [0] => Array 
      (
       [id] => 123 
       [user_id] => 121 
       [path] => Somewhere 
      ) 
    )    

)

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