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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

PHP

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

Q&A

解決済

2回答

3115閲覧

LaravelでbelongsToManyによるテーブルの連携ができない。

WASWAS

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

PHP

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

0グッド

0クリップ

投稿2020/07/26 09:39

編集2020/07/26 09:41

LaravelでbelongsToManyによるテーブルの連携ができず力をお借りしたいです。

現在掲示板アプリを作成していて、「いいね」機能を実装しようとしています。
belongsToManyでのDBを連携する方法についての解決策をお聞きしたいです。

####利用環境
macOS Catalina 10.15.6
Laravel 7.21.0
MAMP Version5.7

・テーブル

usersテーブル(利用者)
boardsテーブル(投稿)
そして中間テーブルにlikesテーブルを作りました。

カラムは以下のとおりです。

users
id
name
email
password
boards
id
user_id
title
message
likes
id
user_id
board_id
message

####リレーション方法
いいね機能を付ける前はusers,boardsテーブルをhasMany,belongsToメソッドを使い一対多で問題なく連携できていました。
しかし、likesテーブルを作り以下のようにbelongsToManyで連携しようとしましたところエラーになりました。

hasManyやbelongsToで動いていたのでbelongsToManyに変更したせいで、他で変更するべき部分があるのかと思い調べましたが、事例が見つからず困っております。

####エラーコードです

Illuminate\Database\Eloquent\RelationNotFoundException Call to undefined relationship [user] on model [App\Board]. http://localhost:8000/boards

この関係が定義されていないと言われているuserはコントローラーにあります。↓↓

####コントローラー

class BoardController extends Controller { public function index() { $boards = Board::with('user')->get(); return view('boards.index',compact('boards')); } }

####ルーティング

Route::resource('/boards', 'BoardController');

モデルです。

  • User.php
public function boards(){ return $this->belongsToMany('App\Board','likes'); }
  • Board.php
public function users() { return $this->belongsToMany('App\User','likes'); }
  • Like.php(空です)
class Like extends Model { // }

マイグレーションです

  • xxxx_create_users_table.php
public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); }
  • xxxx_create_boards_table.php
public function up() { Schema::create('boards', function (Blueprint $table) { $table->id(); $table->integer('user_id'); $table->string('title'); $table->string('message'); $table->timestamps(); }); }
  • xxxx_create_likes_table.php
public function up() { Schema::create('likes', function (Blueprint $table) { $table->id(); $table->bigInteger('board_id')->unsigned(); $table->bigInteger('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->foreign('board_id')->references('id')->on('boards')->onDelete('cascade'); $table->timestamps(); }); }

分かりづらい点があれば追記します。
宜しくおねがいします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

user じゃなくて users ではないでしょうか。

投稿2020/07/26 11:05

yuki84web

総合スコア1857

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

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

WASWAS

2020/07/27 09:20

ありがとうございます。 おっしゃるとおりで確かにusersにするのが正しいようでした。 ただ、usersにしたところ他のエラーが出てしまいました。 エラー内容は以下の通りでした。 Exception Property [name] does not exist on this collection instance. (View: laravelproject/resources/views/boards/index.blade.php) http://localhost:8000/boards エラーの起きている部分は views/boards/index.blade.phpで @foreach($boards as $board) 〜略〜 投稿者:{{$board->users->name}} 〜略〜 @endforeach という部分に対してエラーが起きています。 考えとしては、Boardモデルのusers()にアクセスしてusersテーブルとつながってそのuserテーブルのnameプロパティを撮ってくるのではないかと思っています。ただ、そのnameが存在しないとのエラーが出ています。
yuki84web

2020/07/27 12:41

$boardの中身を見れますか?(デバッグ関数とかで) あと、参考になりそうな文献がありました→https://stackoverflow.com/questions/46846225/property-name-does-not-exist-on-this-collection-instance
WASWAS

2020/07/28 10:20

ご回答ありがとうございます。 dd($board)の中身を確認しました。(長いのでコメント後半に貼り付けます。) 「#relations: array:1 」に"users"とあり、$board->usersまでは問題なく連携できているようです。 そして、参考URLのとおりにforeachを入れて以下のようにしたところ表示されました。 views/boards/index.blade.phpの中で ・変更前 ------------------------------------------------ @foreach($boards as $board) 〜略〜 投稿者:{{$board->users->name}} ←これがエラー原因 〜略〜 @endforeach ----------------------------------------------- ・変更後 ----------------------------------------------- @foreach($boards as $board) 〜略〜 @foeach($board->users as $user) 投稿者:{{$user->name}} ←表示されました @endforeach 〜略〜 @endforeach ----------------------------------------------- どうやら配列で入っているようでした。 ただ、このあとにforeach文の中にforeach文が入ったために$boardのループが表示されなくなり常に1つの投稿しか表示されなくなりました。 そして、根本的な問題解決には至りませんでしたが、以下の方法で問題回避しました。 ・usersテーブル、boardsテーブルにbelongsToManyを削除して、下記を記入 --------------------------------------------------------- public function likes() { return $this->hasMany('App\Like'); } --------------------------------------------------------- ・中間テーブルlikesに下記を記入 -------------------------------------------------------- public function users() { return $this->belongsTo('App\User'); } public function boards() { return $this->belongsTo('App\Board'); } ------------------------------------------------------ yuki84webさん、かなり苦労していたので大変助かりました。 本当にありがとうございました。 配列として入っているということがわかっただけでもとても勉強になりました。 初学者の身ではありますが、今後はこういった質問に回答していけるエンジニアになりたいと思いました。 -----------------------dd($board)-------------------------------------------- App\Board {#1246 ▼ #guarded: array:1 [▶] #connection: "mysql" #table: "boards" #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:6 [▼ "id" => 1 "user_id" => 1 "title" => "aaaaaaaaaaaa" "message" => "aaaaaaaaaaaaaaaa" "created_at" => "2020-07-26 17:05:01" "updated_at" => "2020-07-26 17:05:01" ] #original: array:6 [▶] #changes: [] #casts: [] #classCastCache: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: array:1 [▼ "users" => Illuminate\Database\Eloquent\Collection {#1253 ▼ #items: array:1 [▼ 0 => App\User {#1251 ▼ #fillable: array:3 [▶] #hidden: array:2 [▶] #casts: array:1 [▶] #connection: "mysql" #table: "users" #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:8 [▼ "id" => 1 "name" => "TestUser1" "email" => "test1@test.com" "email_verified_at" => null "password" => "$2y$10$.I3Ijdbch4R1/nVRSZeX6uzaulTRKg1wQyvEkQyqMNrV.8CCyj0GG" "remember_token" => null "created_at" => "2020-07-26 17:04:53" "updated_at" => "2020-07-26 17:04:53" ] #original: array:10 [▼ "id" => 1 "name" => "TestUser1" "email" => "test1@test.com" "email_verified_at" => null "password" => "$2y$10$.I3Ijdbch4R1/nVRSZeX6uzaulTRKg1wQyvEkQyqMNrV.8CCyj0GG" "remember_token" => null "created_at" => "2020-07-26 17:04:53" "updated_at" => "2020-07-26 17:04:53" "pivot_board_id" => 1 "pivot_user_id" => 1 ] #changes: [] #classCastCache: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: array:1 [▼ "pivot" => Illuminate\Database\Eloquent\Relations\Pivot {#1252 ▼ +incrementing: false #guarded: [] #connection: null #table: "likes" #primaryKey: "id" #keyType: "int" #with: [] #withCount: [] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:2 [▶] #original: array:2 [▶] #changes: [] #casts: [] #classCastCache: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: [] #touches: [] +timestamps: false #hidden: [] #visible: [] #fillable: [] +pivotParent: App\Board {#1242 ▶} #foreignKey: "board_id" #relatedKey: "user_id" } ] #touches: [] +timestamps: true #visible: [] #guarded: array:1 [▶] #rememberTokenName: "remember_token" } ] } ] #touches: [] +timestamps: true #hidden: [] #visible: [] #fillable: [] } ---------------------------------------------------------------------------------------------------------------
yuki84web

2020/07/28 10:25

解決できたようで良かったです。私もまだ質問したりすることがあるレベルですが、ありがとうございます。
guest

0

自分も稀に遭遇するのですが、一度Apache(かNginxらへん)を再起動してみてください。
(コードを詳しくみていないので、それで改善しなかったら教えてください。

投稿2020/07/26 10:43

kyoya0819

総合スコア10429

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

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

WASWAS

2020/07/27 08:58

ご回答ありがとうございます。 phpのビルトインサーバーを使っているので、再起動しました。 また、マイグレーションのリフレッシュやPCの再起動も行いました。 それでも状況は変わりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問