2012-01-12 14 views
3

cakePHPで問題が見つかりました。私は、クラブモデル、UserモデルとPostモデルを持っている:CakePHP - 関連がある条件を見つける

クラブhasManyのポスト

クラブHABTMユーザー

は基本的に、私のclubs_usersテーブルはまた、このようなのは、「制限」をしましょうと 'などの追加フィールドが含まれています「diff」はそれぞれ、ユーザが表示したい投稿の最大数と、その投稿がどれくらい古いことができるかを示します。私は、特定のユーザーに関連するすべてのクラブに適切な投稿を選択したいと考えています。私はこのようなsometingをしています

 $clubs = $this->Club->User->find('first', array(
     'conditions' => array('User.id' => $id), 
     'contain' => array(
      'Club' => array(
       'fields' => array(
        'id', 
        'name' 
       ), 
       'Post' => array(
        'fields' => array(
         'id', 
         'title', 
         'description', 
         'created', 
        ), 
        'order' => array('Post.created' => 'DESC'), 
        'conditions' => array(
         'DATEDIFF(NOW(), `Post.created`) <= /* 1 */', 
        ), 
        'limit' => '/* 2 */' 
       ) 
      ) 
     ) 
    )); 

私は何のためにこれを動作させるべきですか?私はClubsUser.diffとClubsUser.limitを試しましたが、where句ではこれらのフィールドが不明であるとのエラーが出ました。

何か歓迎致します。

読んでいただきありがとうございます。

編集

bancerさんのコメントの後、私は、MySQLのドキュメントに深く見て、そのLIMITが唯一の数値引数を期待登場。だから私は今、あまりにも古くない投稿を返すだけです。最後のクエリが返す

SELECT * FROM `users` AS `Follower` 
WHERE `Follower`.`id` = 1 
LIMIT 1 

SELECT * FROM `clubs` AS `Club` 
JOIN `clubs_users` AS `ClubsUser` 
ON (`ClubsUser`.`user_id` = 1 AND `ClubsUser`.`club_id` = `Club`.`id`) 
ORDER BY `ClubsUser`.`role_id` DESC 

SELECT * FROM `posts` AS `Post` 
WHERE DATEDIFF(NOW(), `Post`.`created`) <= `ClubsUser`.`max_time_posts` AND `Post`.`club_id` = (1) 
ORDER BY `Post`.`created` DESC 
LIMIT 10 

:私の新しい発見は、それが3つの以下のSQLクエリを(私は明快さの理由のために*で名前のフィールドを置き換え)を生成し(実際のフィールド名で)

$overview = $this->Club->Follower->find('first', array(
     'conditions' => array('Follower.id' => $this->Auth->user('id')), 
     'contain' => array(
      'Club' => array(
       'fields' => array(
        'id', 
        'name' 
       ), 
       'Post' => array(
        'fields' => array(
         'id', 
         'title', 
         'description', 
         'created', 
        ), 
        'order' => array('Post.created' => 'DESC'), 
        'conditions' => array(
         'DATEDIFF(NOW(), `Post.created`) <= ClubsUser.max_time_posts', 
        ), 
        'limit' => 10 
       ) 
      ) 
     ) 
    )); 

ですエラー:フィールド「ClubsUser.max_time_posts」未知の句

理想的には、私は上記の代わりに、最後の2つのクエリの下の1に近いクエリを取得したいと思いどこで:

SELECT * FROM `clubs` AS `Club` 
JOIN `clubs_users` AS `ClubsUser` 
ON (`ClubsUser`.`user_id` = 1 AND `ClubsUser`.`club_id` = `Club`.`id`) 
LEFT JOIN `posts` AS `Post` 
ON (`Post`.`club_id` = `Club`.`id` AND DATEDIFF(NOW(), `Post`.`created`) <= `ClubsUser`.`max_time_posts`) 
ORDER BY `ClubsUser`.`role_id` DESC, `Post`.`created` DESC 
LIMIT 10 

+0

?デバッグ出力からコピーします。どんなSQLクエリが必要ですか? – bancer

+0

@bancer:私は自分の質問を編集しました –

答えて

2

Cakeは実際にこれらの結合を削除して再作成するため、結合テーブルに余分なフィールドがある場合はHABTMを使用しないでください。あなたは協会「を通じてhasManyの」使用する必要があります:あなたはUserであなたの検索を行うと、あなたはちょうどそのClubが含まれているClubUserを含ん

Club hasMany ClubUser 
User hasMany ClubUser 
ClubUser belongsTo Club 
ClubUser belongsTo User 

。ここ

$this->User->find('all', array(
    'contain' => array(
     'ClubUser' => array(
      'fields' => array(
       'diff', 
       'limit'), 
      'Club')))); 

詳細:

http://book.cakephp.org/1.3/view/1650/hasMany-through-The-Join-Model

とここに:あなたのコードによって生成されるどのようなSQLクエリ

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through

+0

hasManyを関連付けて試しましたが、同じエラーが返されました。 –

+0

btw、私はdiffとlimitフィールド(私はそれを行うことができる方法を知っている)を選択したくない、私が望むのは条件と制限でそれらを使用することです –

+0

私はそれの値を参照することは可能だとは思わない同じクエリの制限値としてクエリから返されるフィールド。ビューで 'diff'と' limit'の値を使って、どの投稿を表示するかを決めます。 – bjudson

関連する問題