

以下のURLのcakephpのチュートリアルを進めていて、疑問に思ったのですが、  
例えば、foreachで出力した＄dataを使ってfindのヘルパーでデータベースから検索といったプログラムを作る場合、どうすればいいのでしょうか？  
index.ctpのファイル上でfindヘルパーは使えないと思うのですが。。

詳しい方、ご教示ください。  
[http://libro.tuyano.com/index3?id=755001&page=3](http://libro.tuyano.com/index3?id=755001&page=3)


CC BY-SA 3.0
2015-04-12T03:19:56.440
9061
2015-08-14T13:33:15.400
8619
question
php cakephp
cakephpのヘルパーについて


[アソシエーション](http://book.cakephp.org/2.0/ja/models/associations-linking-models-
together.html)を設定しているのでもなければ、コントローラ側でそれぞれ find
しておくことになるかと思います。動作確認はしてないですが、こんな感じで。

[code]

    function index() {
        ...
    
        $datas = $this->MyModel->find('list');
        $submodels = array();
        foreach ($datas as $key => $data) {
            $submodels[$key] = $this->SubModel->find('list', array(
                'conditions' => array(
                    'SubModel.mainkey' => $key
                )
            ));
        }
        $this->set('datas',$datas);
        $this->set('submodels',$submodels);
    }
    
    <?php foreach ($datas as $key => $data): ?>
        <h2><?php echo $data; ?></h2>
        <?php foreach ($submodels[$key] as $submodel): ?>
            <?php echo $submodel; ?>
        <?php endforeach; ?>
    <?php endforeach; ?>
    
[/code]

ここでは MyModel のプライマリキーをキーとした配列に SubModel の find
結果を入れていますが、どういうデータを取得するか、ビュー側に渡すかによって、ここの取得方法や構造は変わってきます。


CC BY-SA 3.0
2015-04-12T06:01:25.727
9071
2015-04-12T06:01:25.727
8000
9061
answer


Ajaxを使えば、CakePHPのMVCを壊さずに、ControllerでViewを意識しすぎることもなく実装できます。

Controllerのほう

[code]

    <?php
    // ※こっちだけ追記
    function ajax($data_id){
        $record = $this->MySampleData->findById($data_id);
        $this->set('record', $record['MySampleData']);
        $this->set('_serialize', ['record']);
    }
    // ※何も手を付けていません
    function index(){
        $this->layout = "Sample";
        $this->set("header_for_layout","Sample Application");
        $this->set("footer_for_layout","copyright by SYODA-Tuyano. 2011.");
    
        $datas = $this->MySampleData->find('list');
        $this->set('datas',$datas);
    }
    ?>
    
[/code]

index.ctp

[code]

    <h1>Index Page</h1>
    <p>MySampleData Index View.</p>
    <table>
    <?php foreach ($datas as $id=>$data): ?>
        <tr>
            <td>
                <div class="data" data-id="<?php echo $id; ?>"><?php echo $data; ?></div>
                <div class="data-extra"></div>
            </td>
        </tr>
    <?php endforeach; ?>
    </table>
    <script>
    // クリックすると更に検索
    $('.data').click(function(){
        var elem = this;
        $.ajax({
            url: 'ajax.json?id='+$(elem).attr('data-id'), // ここは書き換えてください
            type: 'json',
            success: function(json){
                $('.data-extra', elem).html(json.record.extra); // 大雑把だけれど
            },
            error: function(){
                alert('通信エラー');
            }
        });
    });
    </script>
    
[/code]

一気に検索するならアソシエーションを使うべきですが、個々に検索でいいのなら、私はこのほうがベターだと思います。ControllerがViewのために使われないかもしれないデータまで毎回ロードするというのは非常に無駄です。

HelperでControllerを呼び出すことは可能ですが、すべきではないです。  
同様に、$this->set('Controller', $this)などで渡すのもしないほうがいいです。  
MVCの意味がなくなってしまいますからね。


CC BY-SA 3.0
2015-08-14T13:33:15.400
14427
2015-08-14T13:33:15.400
10919
9061
answer