0

n...n2つのテーブルの構造がmakesありmodelsます。これまでのところ問題ありません。

次のような3番目のテーブル(products):

id
make_id
model_id
...

私の問題は、makeモデルを含む1つの特定の製品のビューを作成することmakeですProductsController

私はこれがうまくいくと思いました:

var $uses = array('Make', 'Model');

$this->Make->id = 5; // My Make

$this->Make->find(); // Returns only the make I want with it's Models (HABTM)
$this->Model->find('list'); // Returns ALL models
$this->Make->Model->find('list'); // Returns ALL models

したがって、を使用listしてビューにパスしてラジオボタンを作成する場合foreach()は、make配列ですべてのモデルタイトルを検索し、新しい配列を作成して、を介してビューに送信する必要があります$this->set()

$makeArray = $this->Make->find();
foreach ($makeArray['Model'] as $model) {
    $modelList[] = $model['title'];
}
$this->set('models', $models)

makeアレイにストレスをかけずにそのリストを取得する簡単な方法はありますか?私のアプリケーションでそのようなシナリオを開発することは、一般的なタスクになります。

ヒントを事前に感謝します!

4

5 に答える 5

1

これが私のヒントです。Cake ライブラリを使用して再構築する前に、クエリを通常の SQL で記述してみてください。本質的に、DB が実行できる多くの余分な作業を行っています。あなたのアプローチ(ショーのためだけ - 良いSQLではありません):

SELECT * FROM makes, models, products WHERE make_id = 5

リレーションシップを考慮していません (Cake が自動的にテーブルのリレーションシップを理解しない限り)。

あなたはおそらくこれらのものを一緒に結合するものを探しています:

SELECT models.title FROM models 
INNER JOIN products 
  ON products.model_id = models.model_id 
  AND products.make_id = 5

うまくいけば、これは正しい方向への微調整ですか?

于 2008-09-22T02:18:32.687 に答える
1

あなたのコメントから判断すると、あなたが求めているのは、条件が HABTM 関連モデルにある特定のモデルから結果を取得する方法です。つまり、生の SQL で JOIN ステートメントを使用して通常行うことです。
現在のところ、それが Cake の数少ない弱点の 1 つです。それに対処するためのさまざまな戦略があります。

  • 関連するモデル B にモデル A の候補のすべての ID を返させてから、モデル AIe で 2 番目のクエリを実行します。

    $this->ModelB->find('first', array('conditions' => array('field' => $condition)));
    array(
        ['ModelB'] => array( ... ),
        ['ModelA'] => array(
            [0] => array(
                'id' => 1
            )
    )
    

    これで、条件に一致する ModelB に属する ModelA のすべての ID の配列が得られました。これは、Set::extract() を使用して簡単に抽出できます。基本的に に相当しSELECT model_a.id FROM model_b JOIN model_a WHERE model_b.field = xxxます。次に ModelA を探します。

     $this->ModelA->find('all', array('conditions' => array('id' => $model_a_ids)));
    

    これSELECT model_a.* FROM model_a WHERE id IN (1, 2, 3)は、JOIN ステートメントを実行するための回り道です。複数の関連モデルで条件が必要な場合は、ModelA のすべての ID が取得されるまで繰り返します。SQL はすべての ID の共通部分 ( WHERE id IN (1, 2, 3) AND id IN (3, 4, 5)) を使用します。

  • ModelB で必要な条件が 1 つだけで、ModelA を取得したい場合は、ModelB を検索するだけです。Cake は関連する ModelAs を自動的に取得します (上記参照)。それらをもう一度 Set::extract() する必要があるかもしれませんが、それで十分かもしれません。

  • 上記の方法を使用して、Containable 動作と組み合わせて、結果をより詳細に制御できます。

  • 他のすべてが失敗した場合、または上記のメソッドが単にオーバーヘッドを生成しすぎた場合でも、独自の生の SQL を$this->Model->query(). Cake SQL の標準に固執している場合 (テーブルに を使用して正しく名前を付けている場合FROM model_as AS ModelA)、Cake は結果を正しく後処理します。

これがあなたを正しい方向に導くことを願っています。

于 2008-10-02T05:24:57.340 に答える
0

withこのソリューションは、モデルのhabtm配列の操作を使用して実現できます。

を使用しwithて、次のような「中間」テーブルを定義できます。

$habtm = " ...
  'with' => 'MakeModel',
   ... ";

また、内部的には、モデルまたはコントローラーで、findメソッドに条件を発行できます。

参照:http ://www.cricava.com/blogs/index.php?blog = 6&title = modelizing_habtm_join_tables_in_cakephp_&more = 1&c = 1&tb = 1&pb = 1

于 2009-02-03T20:00:54.697 に答える
0

$this->Make->find() の結果からモデル タイトルのリストを取得するための Set::extract() メソッドを確認してください。

于 2008-09-23T19:40:43.563 に答える
0

Make->find() と Model->find() の呼び出しはすべて、互いに完全に独立しています。Make->Model->find() は Model->find() と同じですが、Cake は他のモデルで既に見つけたものを記憶したり考慮したりしません。あなたが探しているのは次のようなものです:

$this->Product->find('all', array('conditions' => array('make_id' => 5)));
于 2008-09-22T07:44:49.080 に答える