0

ユーザー モデルにリンクされたお気に入りのモデルがあります。彼の関係は HasMany で行われます。したがって、このように任意のユーザーからすべてのお気に入りを取得できます。

[User] => Array
    (
        [id] => 60
        [username] => username
        [email] => xxxxxx@gmail.com
    )
[Favorite] => Array
    (
        [0] => Array
            (
                [id] => 7
                [book_id] => 15
                [user_id] => 60
                [position] => 1
                [created] => 2012-08-08 04:08:54
            )

        [1] => Array
            (
                [id] => 6
                [book_id] => 17
                [user_id] => 60
                [position] => 1
                [created] => 2012-07-26 04:08:32
            )

    )

しかし、この Result には、すべての Book データと関連オブジェクトが表示されるわけではありません。そこで ii は、id のリスト ([15,16 ....]) を与える find('all') でそれらを見つけることにしました。唯一の問題は、Favorite.created DESC で私の注文にリンクされていないことです。Books アイテムを別の順序で取得します。

私のクエリは実際には次のようになります。

    $result = $this->User->findById($id);
    $conditions = array('Book.id' => Set::extract($result, 'Favorite.{n}.book_id'));
    $favorites = $this->Book->find('all', array('conditions' => $conditions));

モデルの関係を変更する方法はありますか? またはcakephpでの私のクエリ?

4

1 に答える 1

0

Book Model と Favorite Model の間に Join を作成する必要があります。あなたの場合、BindModel を使用して Join を作成できます。ここで私の例では、Cakephp が hasMany との Join を作成せず、hasOne と BelongsTo のみで Join を作成するため、'hasOne' を使用しました。

    $this->Book->bindModel(array('hasOne' => array(
                                    'Favorite' => array(
                                        'className' => 'Favorite'))));
    $id = $this->Auth->user('id');
    $data = $this->Book->find('all', array(
            'conditions' => array('Favorite.user_id' => $id),
            'order' => array('Favorite.created' => 'DESC')));

それで全部です。

于 2012-08-10T02:35:40.793 に答える