質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.05%

Cakephpでモデルのテーブルをコントローラに落とし込めていない。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,580

score 25

お世話になります。

http://webcake.no003.info/event/cakephp2-8hours-seminar.html
上記のサイトの6と全く同じ内容でデータベースの設定・テーブルの設定・Viewの設定・コントローラの設定を行いました。
コントローラの名前だけGreen1という名前に書き換えています。
Green1Controller.phpのコードは下記になります。
<?php
class Green1Controller extends AppController {

/*使用するモデルを指定*/

public $users = array('Posts');
/*自動レンダリング無効*/

public $autoRender=false;

/**

  • indexアクション
    */

public function index() {

//全件取得

$data = $this->find('all');

//デバッグ表示
debug($data);
}
}

そしたら表示されなくて何が原因かわかっていません。

Apacheのエラーログは下記になります。
Wed Aug 16 16:55:43.380566 2017] [:error] [pid 13288:tid 1920] [client ::1:64942] PHP Fatal error:  Call to undefined method Green1Controller::find() in C:\\xampp\\htdocs\\cakephp2\\app\\Controller\\Green1Controller.php on line 19

エラーで出ているのは、$data = $this->find('all'); になります。

アドバイスいただければ幸いです。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

手元に環境がないため未検証の回答となりますが、

以下のように修正してみてください。

 Before
<?php
class Green1Controller extends AppController {

    public $users = array('Posts');

    public $autoRender=false;

    public function index() {

        $data = $this->find('all');

        debug($data);
    }
}
 After
<?php

App::uses('AppController', 'Controller'); // 追加(無くても動くかもしれないが、念のため)

class Green1Controller extends AppController {

    // public $users = array('Posts');
    public $uses = array('Posts'); // $users ではなく $uses

    public $autoRender=false;

    public function index() {

        // $data = $this->find('all');
        $data = $this->Posts->find('all');

        debug($data);
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/16 19:04

    リクエストURL に Controller.php をつけてはいけません。
     Before : /cakephp2/green1Controller.php
     After : /cakephp2/green1

    仕組みを理解しないままサンプルコードのカスタマイズをしても、今回のようにハマるだけです。

    何かを理解したいなら、その何かの公式のマニュアルやドキュメントを参照するようにしてください。
    https://book.cakephp.org/2.0/ja/controllers.html

    キャンセル

  • 2017/08/17 10:11

    ありがとうございます。
    公式マニュアルをわかるまで見るようにします。
    ご親切にお答えいただいてありがとうございます。

    キャンセル

  • 2017/08/17 11:52

    Good Luck!

    キャンセル

+1

本来ならここは何かしらのモデル(であらわされるentity)の全件取得ですから、そもそも $this->find() であることがおかしいです。

通常は

// CakePHP 2.x
$data = $this->{モデル}->find('all');

// CakePHP 3.x
$data = TableRegistry::get(テーブル名)->find()->all();


のようになるのですが。

※CakePHP では 2 と 3 で ORM 周りがごっそり変わっていますので、バージョンは明記してください

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/16 18:51 編集

    {モデル}のところは、全件取得したいモデルの名前が入るんですよ?
    モデルが Posts なら
    $data = $this->Posts->find('all');
    です。

    https://book.cakephp.org/2.0/ja/models.html
    も読んで、何が足りないのかよく見てみてください。

    キャンセル

  • 2017/08/17 10:10

    コメントありがとうございます。
    $data = $this->Posts->find('all'); でやってみても動かず、tacsheaven様に変身したようなエラーログが、tmpのエラーログに書き出されていました。

    cakephpのマニュアルをわかるまで見るようにします。
    ありがとうございます。

    キャンセル

  • 2017/08/17 10:13

    ご親切にご回答していただいてありがとうございます。

    全権取得したいModelの名前を入れてやってみましたが、それでもだめだったのです。
    なので、何がダメなのか理解できていないまま進むのはまずいと思うのでまずは公式マニュアルをじっくり読んで理解してから再TRYしてみたいと思います。
    ご親切にありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る