1

わかった。私の問題をできるだけ簡潔に表現しようとしています。私はこの大規模なプロジェクトを持っています。その主な目的は、モデル データから構成ファイルを生成することです。構成情報のためにデータベースを収集するときに、効率的な方法で適切な情報を取得する方法について途方に暮れています。モデル:地区、部門、ユーザー、運送業者。

  • 区域
    • hasMany部門
    • | id | name |
  • デパートメント
    • DepartmentPositionよる hasMany User
    • | id | name | district_id | tone_name | tone_length |
  • ユーザー
    • hasMany Department から DepartmentPositionまで
    • 所属するキャリアへ
    • | id | name | phone | email | carrier_id | notify_method (tiny int) |
  • キャリア
    • hasManyユーザー
    • | id | name | mms_gateway |
  • 所属部署
    • 所属するユーザー、部署
    • | id | user_id | department_id | role |

上記のすべてのモデルに関連付けられたフィールドを使用して、地区ごとに構成ファイルが生成されます。学区内の各部門について、次の文字列を追加する必要があります。文字列は、終了すると構成ファイルに保存されます。

[tone_name] //comes from department name
    tone = 123 //from department tone
    tone_length = 4 //from department tone_length
    mp3_emails = person@gmail.com, person2@gmail.com ... //comes from user email
    amr_emails = 5551239999@vzwipix.com //concat of user phone and carrier mms_gateway

基本的に、部門の mp3_emails と amr_emails のリストは、ユーザー フィールドに基づいて、その部門のユーザーに基づいて生成する必要があります。notify_method次のようにして、これらの電子メールフィールド以外のすべてを構成ファイルに入れることができました。

//districts controller
public function generate_config(){
    $districts = $this->District->find('All'); 
    $this->set(compact('districts'));
}  

次に、ビュー ファイルの場合:

    <?php
    $output = '';
    $br = " \r\n";
    $unrelated = array('id', 'name', 'district_id', 'tone_name');
    foreach($districts as $district){
        $name = $district['District']['name'];
        $output .= "#{$name} configuration".$br;
        $departments = $district['Department'];
        foreach($departments as $department){
            $output .= "[".$department['tone_name']."]".$br;
            foreach($department as $key => $value){
                if(!empty($value)&&(!in_array($key, $unrelated))){
                    $output .= $key." = ".$value.$br;   
                }

            }
            $output .= $br;
        }
    }
    echo nl2br($output);
    ?>

それはこのようなものを出力します

#District 1 config
[Department1]
    tone = 123
    tone_length = 4

[Department2]
    tone = 24.7
    tone_length = 2

私がしなければならないことは、各部門のメーリング リストを生成することですが、これを行う賢明な方法がわかりません。関係のために追加のデータを保存しているので、代わりに使用しなければならないと感じた hasMany ではなく、 HABTM 関係を使用したdepartments方がはるかに簡単だと思います。users助言がありますか??何かについてもっと明確にする必要があるかどうかを遠慮なく尋ねてください。ただし、圧倒的な詳細を最小限に抑えながら、すべての関連情報を提供しようとしました. ありがとうございました!!!

編集

@Drewdiddy611 のおかげで、私の正気は保たれました。収容可能な動作は、この問題に最適です。ですから、誰かが完全なプロジェクトのオーバーホールを避けてくれることを願っています。

モデルに以下を追加するだけです: public $actsAs = array('Containable'); 次に、検索クエリを実行し、以下に示すように包含可能な動作を実装することができました。各District/の繰り返しにさらに深みを加えることができましたDepartment。返された配列は、以下で選択した回答に書かれているとおりだったので、非常に簡単でした!!! ありがとう!

4

1 に答える 1

1

テーブル/データに基づいて「hasMany through」関係を使用するのは正しかったと思います。Cakephp 2.1 では、「keepExisting」に設定できる HABTM リレーションシップ用の「一意の」キーが追加され、失われたデータを回避することになっています。

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through - メイン ヘッダーの下の「2.1 で変更」セクションを見てください。

試してみませんか?

また、収容可能な動作を確認することもできます。次に、次のことができます。

<?php
//model
var $actsAs = array('Containable');

//controller
$this->District->contain(array(
    'Department' => array(
        'DepartmentPosition' => array(
            'User' => array(
                'Carrier'
            )
        )
    )
));
$districts = $this->District->find('all');
$this->set(compact('districts'));

// I believe this will be the outcome after the find.
///////////////////////////////////////////////////////
// array(
//     [0] => array(
//        'District' => array(...),
//        'Department' => array(
//            [0] => array(
//                '...' => '...', // repeated...
//                'DepartmentPosition' => array(
//                    [0] => array(
//                        '...' => '...', // repeated...
//                        'User' => array(
//                            '...' => '...', // repeated...
//                            'Carrier' => array(
//                                '...' => '...', // repeated...
//                            )
//                        )
//                    )
//                ) 
//            )
//        )
//    )
// )

?>

-アンドリュー

于 2013-04-04T09:56:17.100 に答える