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

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

新規登録して質問してみよう
ただいま回答率
85.49%
FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

949閲覧

FuelPHPで、外部キー制約のあるデータにNULLが来ても出力する方法について

qwe001

総合スコア133

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2019/02/04 09:20

もうどうしたらいいかわからなくなったので質問します。
外部キー制約のあるデータを、HTML出力しようと思っています。

次のようなテーブル定義です(説明に必要なカラムだけを抜粋しています)

CREATE TABLE categories ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(128) NOT NULL UNIQUE, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO categories (name) VALUES ('たまご'), ('やさい'), ('おにく') ; CREATE TABLE products ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(128) NOT NULL, category_id int(11) DEFAULT NULL, PRIMARY KEY (id), FOREIGN KEY (category_id) REFERENCES categories(id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO items (name, category_id) VALUES ('オムライス', 1), ('まぐろ丼', NULL) ;
Model class Model_Products extends \Orm\Model { protected static $_belongs_to = array( 'category' => array( 'model_to' => 'Model_Categories', 'key_from' => 'category_id', 'key_to' => 'id', 'cascade_save' => false, 'cascade_delete' => false, ), ); } class Model_Categories extends \Orm\Model { protected static $_has_many = array( 'products' => array( 'model_to' => 'Model_Products', 'key_from' => 'id', 'key_to' => 'category_id', 'cascade_save' => false, 'cascade_delete' => false, ), ); }
View <h1>今日の料理</h1> <h2>料理名:<php echo $product->name; ?></h2> <h3>料理カテゴリ:<php $product->category_id ? print($product->category->name) : null ?></h3> (出力例) <h1>今日の料理</h1> <h2>料理名:オムライス</h2> <h3>料理カテゴリ:たまご</h3>

category_idが存在するならば、カテゴリ名を出力し、
存在しない(設定値がNULL)ならば、何もしないというような処理です。

ある商品に適切なcategory_idが設定されていれば、期待したカテゴリ名を出力してくれますが、
category_idにNULLが設定されていると、次のエラーが表示されます。

Fatal Error! ErrorException [ Fatal Error ]: Method Fuel\Core\View::__toString() must not throw an exception, caught Error: Unsupported operand types APPPATH/views/template.php @ line 0 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title><?php echo $page_title; ?></title> Backtrace COREPATH/bootstrap.php @ line 71 else { logger(\Fuel::L_ERROR, 'shutdown - ' . $e->getMessage()." in ".$e->getFile()." on ".$e->getLine()); } } return \Errorhandler::shutdown_handler(); }); set_exception_handler(function ($e) { // reset the autoloader Prior Non-Fatal Errors Warning: get_class() expects parameter 1 to be object, null given in COREPATH/classes/security.php @ line 242 foreach ($value as $k => $v) { $value[$k] = static::htmlentities($v, $flags, $encoding, $double_encode); } } elseif ($value instanceof \Iterator or get_class($value) == 'stdClass') // elseif ($value and ($value instanceof \Iterator or get_class($value) == 'stdClass')) { // Add to $already_cleaned variable $already_cleaned[] = $value; Warning: Invalid argument supplied for foreach() in COREPATH/classes/view.php @ line 283 protected function get_data($scope = 'all') { $filter_closures = $this->filter_closures; $clean_it = function ($data, $rules, $auto_filter) use ($filter_closures) { foreach ($data as $key => &$value) { $filter = array_key_exists($key, $rules) ? $rules[$key] : null; $filter = is_null($filter) ? $auto_filter : $filter; if ($filter)

Laravelであれば上のようなコードで普通に期待したことが出来たため、
FuelPHPも同様だと思ったら全然うまくいきませんでした。。

どのようにすれば、この問題を解消できるのでしょうか?
外部キー制約をやめるべきですか? あるいは、NOT NULL制約を設けたらいいのでしょうか。
質問内容がふわふわしてて申し訳ありません。皆様何卒アドバイスをよろしくお願いいたします。

なお、FuelPHP1.8 PHP7です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。原因はPHP「7.2」だったことです。
7.2からは、エラーにもあるように、get_class関数にNULLが許容されなくなりました。
ですが、FuelPHP1.8はその変更に対応していないようで、今回のエラーが出ることになりました。

対策の方法は他の方が書いた以下のURLにある通りです。

https://qiita.com/ichi_404/items/d5b656d4142b1e19d97e

投稿2019/02/07 00:57

qwe001

総合スコア133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問