Call to a member function order_by() on a non-object[FuelPHP入門]

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で原則。
以下のサイトが見つかった。

Fatal error: Call to a member function **() on a non-object in ○○ on line △△ | 「Fatal error(エラーメッセージ)」カテゴリー | PHP用語

○○ファイルの△△行目付近(以前)で、オブジェクトに関連付けられていないメンバー関数を呼び出したことによる、致命的エラー

メンバー関数ってなに?
→クラスの静的メソッドのこと。

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 ドキュメント

【fuelphp】モデルからのデータ取得 – Yahoo!知恵袋

Mome, FuelPHP Model_XXX::find()->get()は注意が必要

コメント

タイトルとURLをコピーしました