0

ねえ、私は誰かがこれを機能させるのに十分なCakePHPの経験を持っていることを望んでいます。

私は現在、愛情を込めてツイッタークローンと呼ぶことができる何かに取り組んでいます。基本的に私はこのような設定をしています。

ユーザーにはたくさんの友達がいます。これは、ユーザーテーブルとの多対多の関係です。これは、列user_id、friend_idを持つfriends_usersというテーブルのリンクに格納されます。Usersは、列user_idを持つテーブルです。

次に、ユーザーに関連付けるヒントと呼ばれるテーブルがあります。ユーザーは多くのヒントを持つことができます。

渡したユーザーIDが所有するすべてのヒントと、そのユーザーの友達が所有するヒントを返すヒントモデルを検索する方法を見つけたいと思います。

このSQLクエリは完全に機能します-

SELECT *
FROM `tips`
JOIN users ON users.id = tips.user_id
JOIN friends_users ON tips.user_id = friends_users.friend_id
WHERE (friends_users.user_id =2 or tips.user_id=2)
LIMIT 0 , 30

これにより、user#2sのヒントと、User2の友達である人のヒントが返されます。

今、私はどのように同じことをすることができますか$this->Tip->findxxxxx(user_id)

必要に応じて使用できることはわかっていTip->queryますが、難しい方法を学ぼうとしています。

4

3 に答える 3

3

クエリの結果に必要なのはヒントのリストだけである場合、これを 2 つのクエリで実行したくなるでしょう。最初にこのユーザーとその友達のユーザー ID のリストを検索し、2 番目にこれらの ID のいずれかに属するヒントを検索します。したがって、Tip モデルでは次のようになります。

function findTipsByUserAndFriends($userId) {
  //FriendsUser is automagically created by CakePHP "with" association
  $conditions = array('FriendsUser.user_id'=>$userId);
  $fields = 'FriendsUser.friend_id';
  //get a list friend ids for the given user
  $friendIds = $this->Tip->User->FriendsUser->find('list', compact('conditions', 'fields'));
  //get list of all userIds for whom you want the tips
  $userIds = array($userId) + $friendIds;
  $conditions = array('Tip.user_id'=>$userIds);
  $tips = $this->Tip->find('all', compact('conditions'));
  return $tips;
}

CakePHP が HABTM friends_users テーブルをモデル化するために使用する、自動的に作成された "FriendsUser" モデルで最初の検索を呼び出していることに注意してください。したがって、作成する必要はありません。

これはテストされていないため、一部をデバッグする必要があるかもしれませんが、アイデアは得られます。

于 2008-10-13T08:52:30.437 に答える
1

うまく機能するcontainableを使用することをお勧めします。

$aCond = array(
            'fields' => array(
                'Discount.*'
            ),
            'contain' => array(
                'Event' => array(
                    'conditions' => array('Event.id' => $iEventId)
                )
            )
        );
$aBulkDiscounts = $this->Discount->find('first', $aCond);

お役に立てれば。

于 2011-07-15T09:55:50.823 に答える
0

CakePHPの話では、多対多は「多対多」(HABTM)です。リレーションを適切に設定したとすると、次に行う必要があるのは、2レベルの再帰検索を行うことです。たとえば、見つけた友達がすべての友達を取得し、それらの友達がヒントをロードします。それらの友達が友達を取得するのを防ぐために、モデルを動的にバインド/バインド解除する必要がある場合があります(ただし、実際にはそれほど問題にはならない場合があります)。

アソシエーションの手動エントリは必読です。

于 2008-10-13T01:50:09.413 に答える