1

重複の可能性:
CakePHP で追加の条件を提供しながら、HABTM リレーションシップに基づいてテーブルをクエリするにはどうすればよいですか?

私は、多対多の関係を持つ 2 つのテーブル (地域とサファリ) を使用しています。これらのテーブルは、regions_safaris という別のテーブルによって結合されます (フィールドは region_id $ safari-id です)。特定の地域で 5 日間の期間など、特定の基準を満たすすべてのサファリを取得したいと考えています。これは Cakephp で実装する必要があります

4

2 に答える 2

1

モデルが正しく関連付けられていると仮定します。これらは、同様の状況で使用するコード行です。habtm 条件でフィルタリングする場合、最も制限の厳しいフィルターを持つモデル (またはデータベースを最も速く検索するモデ​​ル) から始めると役立つことがわかりました。この場合は地域です。

Safari コントローラから:

$conditions = array('conditions' => array('Region.id' => 'yourRegion', 'Safari.duration' => 5);
$this->Safari->Region->recursive = 1;
$safaris = $this->Safari->Region->find('all', $conditions);

次に、print_r($safaris) を実行し、ネストされた領域配列を介して各サファリにアクセスできるようにする必要があります。すなわち:

$safaris['Region'][0]['Safari'][0]['name']

これにより、条件に一致する最初に関連付けられた最初のリージョンが返されます。print_r($safaris) を使用してデータ構造をよく見ると、私の言いたいことがわかるでしょう。

于 2009-03-02T14:31:12.203 に答える
1

これは、php の問題というよりはデータベースの問題のようです。リージョン 'yourRegion' にマップされているすべての 5 日間のサファリのリストを取得するための構文 (MySQL などのほとんどの DB の場合) は次のとおりです。

table safari:
id
name
duration

table region:
id
name

table regions_safaris:
safari_id
region_id

select s.name
from region r, safaris_regions sr, region r, safari s
where r.name='yourRegion'
and sr.region_id=r.id and s.id=sr.safari_id and s.duration=5;
于 2009-03-02T11:47:04.970 に答える