2

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

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

我已经建立了以下关系:用户有很多照片。

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

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

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

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

4

4 回答 4

3

您还可以使用Containable 行为,然后设置如下内容:

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

)

于 2010-11-02T06:16:39.187 回答
2

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

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

为您提供一张照片,$data['Photo']其中包含附加的用户$data['User']

于 2010-10-28T23:22:07.380 回答
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]
于 2010-10-28T23:07:04.317 回答
0

你会做这样的事情:

$user = $this->User->find('first', array('conditions' =>
                array('username'=>$this->data['User']['username'],
                      'active'=>true) ));
于 2010-10-28T22:47:35.350 回答