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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

2回答

5745閲覧

Laravel 5.3でhasManyがundefinedとなる

TakahiroDeto

総合スコア14

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/05/12 01:24

###前提・実現したいこと
laravelで口コミ付きのランキングサイトを作っています。
ranking modelの各項目が複数のreputation modelを持つ仕様です
** ranking:1 reputation:N のhasMany

###発生している問題・エラーメッセージ
外部キー制約をつけた上で、seedデータを投入した際に、
rankingモデルが持つはずのreputations()メソッドがundefinedとなりseedに失敗します

Seeding: RankingsTableSeeder Seeding: ReputationsTableSeeder [BadMethodCallException] Call to undefined method Illuminate\Database\Query\Builder::reputations()

下記に、各モデルとmigrationデータ、seedファイルを記載しましたが
個人的にはしっかりメソッドを定義してる認識なのですが、どこか間違いがありますでしょうか・・・?
ご教示いただけると助かります。

###該当のソースコード
Reputationモデル

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Reputation extends Model { protected $guarded = []; public function ranking() { return $this->belongsTo('App\Ranking'); } }

Rankingモデル

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Ranking extends Model { protected $guarded = []; public function reputations() { return $this->hasMany('App\Reputation'); } }

migration (一部カラムのみ抜粋)

class CreateRankingsTable extends Migration { public function up() { Schema::create('rankings', function (Blueprint $table) { $table->increments('id'); $table->string('service_id',255)->unique(); $table->string('service_type',255); $table->integer('rank'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('rankings'); } } class CreateReputationsTable extends Migration { public function up() { Schema::create('reputations', function (Blueprint $table) { $table->increments('id'); $table->integer('age'); $table->string('gender',50); $table->integer('rating'); $table->text('comment'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('reputations'); } } // 外部キー制約追加用マイグレーション class AddColumnToReputationsTable extends Migration { public function up() { Schema::table('reputations', function (Blueprint $table) { $table->integer('rankings_id')->unsigned(); $table->foreign('rankings_id')->references('id')->on('rankings')->onDelete('cascade'); }); } public function down() { Schema::table('reputations', function (Blueprint $table) { $table->dropForeign('reputations_rankings_id_foreign'); $table->dropColumn('rankings_id'); }); } }

シードデータ

class RankingsTableSeeder extends Seeder { public function run() { DB::table('rankings')->delete(); $data = [ [ 'service_id' => 'hoge1', 'service_type' => 'fuga1', 'rank' => 1, ], [ 'service_id' => 'hoge2', 'service_type' => 'fuga2', 'rank' => 2, ], [ 'service_id' => 'hoge3', 'service_type' => 'fuga3', 'rank' => 3, ], [ 'service_id' => 'hoge4', 'service_type' => 'fuga4', 'rank' => 4, ], ]; for($i = 0; $i < count($data); $i++){ Ranking::create([ 'service_id' => $data[$i]['service_id'], 'service_type' => $data[$i]['service_type'], 'rank' => $data[$i]['rank'], ]); } } } class ReputationsTableSeeder extends Seeder { public function run() { DB::table('reputations')->delete(); $count = App\Ranking::all()->count(); for($i = 0; $i < $count; $i++){ for($k = 0; $k < 10; $k++){ $rep = new App\Reputation([ 'age' => $ages[mt_rand(0,count($ages) - 1)], 'gender' => $genders[$i % count($genders)], 'rating' => mt_rand(0,5), 'comment' => $comments[mt_rand(0,count($comments) - 1)], ]); } // ここでreputationsがundefinedとなるようです $ranking = App\Ranking::all()->orderBy('rank','asc')->take(1)->skip($i)->reputations()->save($rep); } } }

###試したこと

スペルミスも、単数複数もすべて試しましたがダメでした。
また補足情報として、mariadbのtableのprefixとして"tj_"というstringがつくのですが
このprefixがもしや悪さをしているかと思い、

Reputationモデル

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Reputation extends Model { protected $guarded = []; public function ranking() { return $this->belongsTo('App\Ranking','tj_rankings_id'); } }

Rankingモデル

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Ranking extends Model { protected $guarded = []; public function reputations() { return $this->hasMany('App\Reputation','tj_rankings_id','id); } }

のように試しましたがそれでも同様のエラーでした。

###補足情報(言語/FW/ツール等のバージョンなど)
FW:laravel5.3
DB:mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
Centos7.3

お手数おかけしますが、どなたかご教示ください。

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

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

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

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

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

guest

回答2

0

外側のループに記述してことに気づいた(初歩的。。。)ので、内側のループに戻しましたが、それでも動きませんでした。。

for($i = 0; $i < $count; $i++){ for($k = 0; $k < 10; $k++){ $rep = new App\Reputation([ 'age' => $ages[mt_rand(0,count($ages) - 1)], 'gender' => $genders[$i % count($genders)], 'rating' => mt_rand(0,5), 'comment' => $comments[mt_rand(0,count($comments) - 1)], ]); // ここでreputationsがundefinedとなるようです $ranking = App\Ranking::all()->orderBy('rank','asc')->take(1)->skip($i)->reputations()->save($rep); } }

投稿2017/05/12 01:48

TakahiroDeto

総合スコア14

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

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

harashow1701

2017/05/17 16:38

reputationsメソッドを持ってるのは誰でしょう? skipメソッドの返り値は何のオブジェクトでしょう? そこが分かれば、もう原因はわかるよね?
guest

0

投稿してやっと気付きましたが、seedデータのfor(k)が明らかにおかしいですね。なぜ気づかなかったんだろう。。再度自己トライします。

投稿2017/05/12 01:41

TakahiroDeto

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問