FuelPHP[入門]で簡易ブログシステムを作ってる。
すると以下のエラーが出た。
Call to a member function order_by() on a non-object APPPATH/classes/controller/articles.php @ line 12
該当箇所のコード。
data[‘articles’] = Model_Article::find()->order_by(‘id’, ‘desc’)->get();
今日中に何とかするぞ。
追記
FuelPHPのバージョンの違いもあるけど、自分がアホやったせい。
Templateコントローラを使う場合は、ちゃんとbefore()やafter()を指定すること。
解決 → FuelPHP1.7で「FuelPHP入門」のブログサンプル
1.エラーの意味
エラーの意味を Googleで原則。
以下のサイトが見つかった。
○○ファイルの△△行目付近(以前)で、オブジェクトに関連付けられていないメンバー関数を呼び出したことによる、致命的エラー
メンバー関数ってなに?
→クラスの静的メソッドのこと。
Ormパッケージが読み込まれてない?
つまり、Model_Articleでorder_by()メソッドが使えないってこと?
でも、Model_ArticleはOrm\Modelを継承してるのにな・・・
ってことはOrmクラスが機能してない?
つまり、Ormパッケージがちゃんと読み込まれてない!?
APPPATH/config/config.php を確認。
バッチリ記述されてる。
'always_load' = array( 'packages' = array( 'orm', ), ),
よく考えたら、直前のfind()メソッドでエラー出てない。
本当に、Ormパッケージ読み込まれてないならここでエラーでるよね。
クエリビルダのせい?
メソッドチェーンのせいでorder_by()が使えないとか。
メソッドチェーンとはメソッドを「->」でつなげるやり方。
と思ったけど、Ormでは使えるらしい(CRUD – Orm Package – FuelPHP ドキュメント)。
Model_Crudでは使えない。
order_by()メソッドのせい?
ってことは、order_by()メソッド固有の問題?
order_by()メソッドを取り除いてみる。
data[‘articles’] = Model_Article::find()->get();
以下のエラー。内容が order_by()関数から get()関数に変わっただけ。
Call to a member function get() on a non-object
つまり、order_by()メソッドやget()メソッドではない。それより前の問題。
そもそも find()メソッドでデータ取り出せてないのか?
プロファイラを有効にして実行
プロファイラとは、プログラム実行時の各種情報を取得する。
プロファイラを有効にするため、APPPATH/config/config.php を編集する。
47行目くらいのコメントアウトを解除。
'profiling' = true,
APPPATH/config/development/db.phpを編集。
'profiling' = true,
これで再び実行。
するとプロファイラの画面が表示される。
クエリを確認してみる。
Databaseの部分、「0 Queryies」になってる。SQL文が発行されてないってこと?
2.解決策を模索
Model_Article::find() 部分が悪い?
Model_Article::find() が悪いという可能性を。
この部分はちゃんと動いているのか?
まず、find()メソッドの部分。
デフォルトではすべての ORM の find メソッドはテーブルのすべてのカラムを取得するらしい。
$data['articles'] = Model_Article::find();
以下のエラーが。
Invalid argument supplied for foreach()APPPATH/views/articles/list.php @ line 1
該当コードはこれ。
エラーは $articlesが配列ではないって意味。
<?php foreach ($articles as $article):
この $articles には $data[‘articles’]が渡されてる。
つまり、$data[‘articles’]が配列ではない、または値が入ってないってこと。
やっぱり find()で値を取得できてない。
どんな SQL文発行してるんだろう。
この記事FuelPHP1.6、実行されたSQLを確認する(DEBUG用)。|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~を参考にする。
APPPATH/core/classes/database/query.php のexecute()メソッドの中で以下を記入。
// 追加する部分 print $sql; // 最初からあった return $result;
エラーページ見てもSQL文出てこない・・・
Model_Artilcle が間違ってるってことか?
支離滅裂になってきた。
今日中に終わらなかった・・・
続きは明日!くそーーー。
追記1
モデルやfind()メソッドのせいでなく、Controller_Templateの使い方に原因があるっぽい。
ビューの方に変数を渡せてない。
Controller_Templateの挙動を理解しよう。
追記2
色々検証したものをアップした。
FuelPHP1.7で「FuelPHP入門」のブログサンプル
参考
はじめに – Orm Package – FuelPHP ドキュメント
CRUD – Orm Package – FuelPHP ドキュメント
コメント