CakePHPを使い始めたばかりで、取得した結果を、関連付けられたモデルのフィールドが特定の値と一致する結果に制限するのに問題が発生しています。私はここや他の場所で多くの関連する質問を見つけましたが、それらは私のシナリオよりも複雑または単純な状況を扱っているようですので、ここに行きます:
私が興味を持っている2つのモデルがあります。それは、 HABTM関係によって関連付けられているImageとCollectionです。関係は、結合テーブルcollections_imagesを介してImage.phpとCollection.phpで正しく設定されており、一般的にデータの書き込みや取得に問題はありませんでした。ContainableもImageモデルで適切に設定されています。
私がやりたいのは、$ this-> Imageでfind()を実行し、タイトルが$collectionである特定のコレクションに属するものだけを返すことです。私はこれをいくつかの異なる方法で試しました:
$this->Image->contain("Collection"); // to exclude other models "Image" is related to
pr($this->Image->find("all",
array("conditions" => array("Collection.title" => $collection))
));
このため、次のエラーが発生します。
エラー:SQLSTATE [42S22]:列が見つかりません:1054不明な列'Collection.title'が'where句'にあります
関連するモデルを介して検索条件を直接確立することはできないようです。そこで、私は戻って、次のように包含を制限しようとしました。
$this->Image->contain(array(
"Collection" => array(
"conditions" => array(
"Collection.title" => $collection))));
pr($this->Image->find("all"));
今回は結果が出ましたが、適切なコレクションに属していない画像が含まれています。これは、pr()が$ collection="Urban"に対して提供する簡略化されたスニペットです。
[3] => Array
(
[Image] => Array
(
[id] => 39
[title] => Star Trails over Greenlake
)
[Collection] => Array
(
)
)
[4] => Array
(
[Image] => Array
(
[id] => 40
[title] => Aurora Bridge and Reflections
)
[Collection] => Array
(
[0] => Array
(
[id] => 3
[title] => Urban
[CollectionsImage] => Array
(
[id] => 62
[collection_id] => 3
[image_id] => 40
)
)
)
)
ご覧のとおり、コレクションのタイトルが$ collectionと一致しない画像のコレクションデータは省略されていますが、画像データは含まれています。
ここで何が欠けていますか?これらの2つのアプローチのいずれかを私が目指していることを実行させる方法はありますか?
記録のために、私はまた別の方向からそれについて行きました:
$this->Collection->find("all", array("conditions" => array("Collection.title" => $collection)))
必要なデータだけを返します。ただし、返されるデータの配列構造により、コードの他の場所で問題が発生するため、最終的にはImageから直接ページ付けできるようにしたいと考えています。
みなさん、お時間を割いていただきありがとうございます。
編集:
さらに検索した後、私はここで許容できる解決策を見つけました:
http://cakebaker.42dh.com/2007/10/17/pagination-of-data-from-a-habtm-relationship/
これには、マッピングテーブル「CollectionsImage.php」のモデルを作成し、 ImageとCollectionの両方に対してhasOne関係を確立する必要がありました。次に、paginate()がCollectionsImageで実行されます。
$data = $this->paginate("CollectionsImage", array("Collection.id" => $collection_id));
これは少し回り道のようで、指定されたタイトルのコレクションのIDを見つけるために追加の手順が必要になるため、もっと直接的な解決策を知っている人がいるかどうかはまだ疑問です。