2

基本的に、CakePHP には次のモデルがあります。

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

次の関係を設定しました: User hasMany Photo.

1 つの画面で、ユーザーを一覧表示し、各ユーザーの横にランダムな写真を表示したいと思います。次の関係を設定してみました:

ユーザーにはSamplePhotoが1つあります(SamplePhotoは単なる写真モデルです)

ただし、たとえばユーザーが 2 枚の写真を持っている場合、そのユーザーはリストに 2 回表示されます。

基本的に私の質問は、上記のテーブル スキーマにフィールドを追加せずに、hasMany と hasOne の関係を減らすことができますか? ケーキに伝えたいのですが、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

$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 に答える
2

これを必要以上に複雑にしないでください。:)

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

$data['Photo']でユーザーが添付された写真を提供します$data['User']

于 2010-10-28T23:22:07.380 に答える
0

次のようにします。

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