2009-07-29 11 views
0

HABTMを介してリンクされた2つのテーブルがあります。国&ネットワーク。それらはcountries_networksルックアップテーブルによってリンクされています。HABTMクエリのCakePHP配列構造

対応する国ごとに、すべての国と関連するすべてのネットワークIDを取得する必要があります。私はネットワーク名を取得する限りではなく、ルックアップテーブルからIDを取得するだけで十分です。

私がfind(all)を実行すると、それは私に必要な構造ではなく国の配列を与えます。私は何かのリンクを返す必要があり、この、が、私は唯一のCountry.countryNameとCountriesNetwork.network_id必要があります。

Array 
(
    [0] => Array 
     (
      [Country] => Array 
       (
        [countryName] => Aeroplane 
       ) 
      [Network] => Array 
       (
        [0] => Array 
         (
          [id] => 1 
          [CountriesNetwork] => Array 
           (
            [id] => 1 
            [country_id] => 1 
            [network_id] => 1 
           ) 
         ) 

        [1] => Array 
         (
          [id] => 7 
          [CountriesNetwork] => Array 
           (
            [id] => 2 
            [country_id] => 1 
            [network_id] => 7 
           ) 
         ) 
       ) 
     ) 
) 

はfindAllのでこれを行う方法はありますか()?あたかも配列としてフィールドを渡すかのように、私はいつも未知の列名にSQLエラーがあるようです。 カスタムクエリですか?助けることができるかもしれない誰にも事前に感謝します。

答えて

1

Pickledegg、

が鳴ります。これは、あなたが望むように結合されたモデルの条件を指定することを可能にし、通常のfind()呼び出しと同じ方法でフォーマットされたデータを返します。

詳細については、マニュアルを参照してください。

+0

containableはトリックを行いましたが、 set :: extractと組み合わせると:) –

1

network_countriesのモデルがないため、findまたはfindAllを使用してこれらの値を取得することはできません。私は、最も簡単な解決策は、必要なデータを取得するためにカスタムクエリを実行することだと思います。結果は、そのコードを使用して返さ

$query = "SELECT country_id, network_id 
FROM countries C LEFT JOIN network_countries NC ON (NC.country_id = C.id)" 
$this->Country->query($query); 

残念ながらfind結果、その後わずかに異なるフォーマットされます。

ネットワーク国のモデルを追加することもできますが、これは良い考えではありません。あなたが収容可能の行動を調査する必要があるよう

+0

ありがとうRaYell、私はそれが起こったとしてそれを試みましたが、それは私に国を重複して与え、私はフォーマットを 'CountryName'、ネットワークIDまたは名前の配列にします。 –

+0

はい、それはLEFT JOINの仕組みなので、国を複製しますが、それより簡単なことができるかどうかわかりません。私はあなたが国を取得しようとすると、各国のためにネットワークIDを取得するクエリを実行することができますが、1つの代わりに多くのクエリを実行する必要があると思います。 country_idで結果を並べ替えて結果を繰り返して、現在の行のcountry_idが変更されているかどうかを確認することができます。 – RaYell

+0

ありがとうございます:) –