hasMany уменьшен до hasOne в CakePHP - PullRequest
       32

hasMany уменьшен до hasOne в CakePHP

2 голосов
/ 29 октября 2010

В основном у меня есть следующие модели в CakePHP:

User(id, username)
Photo(id, user_id, path)

Я установил следующее отношение: Пользователь имеет много фотографий.

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

У пользователя hasOne SamplePhoto (где SamplePhoto - просто фотомодель)

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

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

Ответы [ 4 ]

3 голосов
/ 02 ноября 2010

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

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

)

2 голосов
/ 29 октября 2010

если вы сделаете поиск, например $ this-> User-> read (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 голосов
/ 29 октября 2010

Не усложняйте это, чем нужно.:)

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

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

0 голосов
/ 29 октября 2010

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

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