hasMany在CakePHP中减少为hasOne

时间:2010-10-28 22:44:57

标签: cakephp relationships has-one

基本上我在CakePHP中有以下模型:

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

我设置了以下关系:用户有很多照片。

在一个屏幕上,我想列出用户,并在每个用户旁边显示随机照片。我尝试建立以下关系:

用户hasOne SamplePhoto(其中SamplePhoto只是照片模型)

但是当用户有两张照片时,他会在列表中列出两次。

基本上我的问题是:你能否减少与hasOne的hasMany关系,而不向上面提到的表模式添加任何字段?我想告诉蛋糕 - 找到Photo表中与某个user_id匹配的第一条记录。

4 个答案:

答案 0 :(得分: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
            )
    )            

答案 1 :(得分:2)

如果您执行类似$ 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 :(得分:2)

不要让它变得比它需要的更复杂。 :)

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

$data['Photo']中为用户添加$data['User']附带的用户。

答案 3 :(得分:0)

你会做类似的事情:

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