1

次のコード行を使用して、特定の(無関係な)条件を持つすべての投稿をタグ「who」でフィルタリングしようとしています

$com= $this->Post->find('all', array('conditions' => $conditions, 'contain' => 'Tag.tag="who"'));

ただし、結果がタグ付きの投稿だけになるのではなく、タグ「who」を持たない投稿の空のタグ配列を持つすべての投稿を取得します。

私の質問が以前に出てきたことは知っていますが、投稿された解決策は私のコードでは機能しませんでした。ここのコードを自分のものに合わせてみました: http://web-development-blog.co.uk/2010/09/14/cakephp-habtm-find-with-conditions-and-containable-behavior/、しかし私はon 句に "Tag.post_id" が見つからないという SQL エラーが発生します。

助けてください。

選択したリンクからコードを実装しようとしたときのエラー メッセージ:

SELECT `Post`.`id`, `Post`.`title`, `Post`.`body`, `Post`.`created`,       `Post`.`modified`, `Tag`.`id`, `Tag`.`tag`, `Tag`.`created`, `Tag`.`modified` FROM `posts` AS `Post` LEFT JOIN `tags` AS `Tag` ON (`Tag`.`post_id` = `Post`.`id`) WHERE `Tag`.`tag` = 'who'    1054: Unknown column 'Tag.post_id' in 'on clause'            

これはこれを使用することによって引き起こされます:

$this->Post->bindModel(array('hasOne' => array('Tag')));
$this->Post->contain(array(
  'Tag'
));
$com=$this->Post->find('all', array(
  'conditions'=>array('Tag.tag'=>'who') 
)); 
4

1 に答える 1

0

あなたのエラーは、外部キーなどを言わずにbindModelを使用していることです。モデルで関連付けを確立し、厳密に必要な場合はこのオンザフライメソッドを使用する必要があります。

Cake 以外のどの外部キーがデフォルトを使用するかを Cake に伝える必要があります。あなたの場合は Tag.post_id を試します。

また、多くの関連付けを使用する必要があります。または、少なくともそう思います。投稿には複数のタグが含まれている可能性があるため、これを言いました。

モデルで関連付けを行い、この行を削除したら

$this->Post->bindModel(array('hasOne' => array('Tag')));

それは完全に機能するはずです

または、その場で正しいパラメーターとの関連付けを行うことができます。これについてはクックブックを読んでください。クラス名を配置する方法を示す例は、あなたが探しているものです。他の属性を追加するだけです

編集:

申し訳ありませんが、何か間違ったことを読んでください... has many アソシエーションは結合を行わないため、contains を使用して条件を指定するか、その場で条件をアソシエーションに追加する必要があります。条件を追加した後のコードは次のようになります。含む

$contain = array(
  'Tag' => array(
       'conditions'=> array('Tag.tag'=>'who') 
   )
);
$com=$this->Post->find('all', array(
  'contain'=>$contain 
));

条件を含めることは、関連付けの条件を上書きすることを忘れないでください!! 追加の条件が必要な場合は、次のようにオンザフライで追加する必要があります。

$this->Post->hasMany['Tag']['conditions'] += array('Tag.tag'=>'who');

その場での関連付けは、そのインスタンスに対してのみ機能することに注意してください。

また、さまざまなタイプに対して hasmany エイリアスを作成することもできます (常にクラス名と外部キーを定義することを忘れないでください)。

修正を確認するためにコメントするだけでなく、今回はうまくいくことを願っています;)

于 2011-10-04T16:17:21.520 に答える