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

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

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

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

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

Q&A

解決済

1回答

442閲覧

PHP/Laravelのリレーションが上手く行かない

TakuMa

総合スコア11

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

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

0グッド

0クリップ

投稿2022/08/10 04:52

編集2022/08/10 05:57

前提

PHP/Laravel でツイッターのようなwebサイトを作りたいと考えています。

実現したいこと

  • リツイート機能の追加

発生している問題・エラーメッセージ

・$fire->retweeted()を指定してもリツイート投稿が出てこない

該当のソースコード

PHP/Laravel

1モデルファイル 2<Fire.php> 3/** 4 * あるリツイート投稿自体を指す 5 */ 6 public function retweeted() 7 { 8 $this->hasMany(Retweet::class, 'retweeted_id', 'id'); 9 } 10 11 /** 12 * あるリツイート投稿の引用元を指す 13 */ 14 public function retweeting() 15 { 16 $this->hasOne(Retweet::class, 'retweeting_id', 'id'); 17 } 18 19マイグレーションファイル 20(retweets) 21public function up() 22 { 23 Schema::create('retweets', function (Blueprint $table) { 24 $table->bigIncrements('id'); 25 $table->unsignedBigInteger('retweeted_id'); 26 $table->foreign('retweeted_id')->references('id')->on('fires')->onDelete('cascade'); 27 $table->unsignedBigInteger('retweeting_id'); 28 $table->foreign('retweeting_id')->references('id')->on('fires')->onDelete('cascade'); 29 $table->timestamps(); 30 31 //この後追加 32 $table->unsignedBigInteger('retweeting_id')->nullable()->change(); 33 }); 34 } 35(fires) 36 Schema::create('fires', function (Blueprint $table) { 37 $table->bigIncrements('id'); 38 $table->unsignedBigInteger('user_id'); 39 $table->string('content'); 40 $table->timestamps(); 41 42 // 外部キー制約 43 $table->foreign('user_id')->references('id')->on('users'); 44 }); 45 46MySQL 47firesテーブル 48----+---------+---------+---------------------+---------------------+ 49| id | user_id | content | created_at | updated_at | 50+----+---------+---------+---------------------+---------------------+ 51| 74 | 1 | 1 | 2022-08-09 17:37:02 | 2022-08-09 17:37:02 | 52| 86 | 1 | 2 | 2022-08-10 13:48:41 | 2022-08-10 13:48:41 | 53| 87 | 1 | 2 | 2022-08-10 13:48:42 | 2022-08-10 13:48:42 | 54+----+---------+---------+---------------------+---------------------+ 55retweetsテーブル 56+----+--------------+---------------+---------------------+---------------------+ 57| id | retweeted_id | retweeting_id | created_at | updated_at | 58+----+--------------+---------------+---------------------+---------------------+ 59| 18 | 86 | 87 | 2022-08-10 13:48:42 | 2022-08-10 13:48:42 | 60+----+--------------+---------------+---------------------+---------------------+ 61 62>>> $fire = Fire::find(86); 63=> App\Fire {#4290 64 id: 86, 65 user_id: 1, 66 content: "2", 67 created_at: "2022-08-10 13:48:41", 68 updated_at: "2022-08-10 13:48:41", 69 } 70>>> $fire->hasMany(Retweet::class, 'retweeted_id', 'id')->get(); 71=> Illuminate\Database\Eloquent\Collection {#4286 72 all: [ 73 App\Retweet {#4306 74 id: 18, 75 retweeted_id: 86, 76 retweeting_id: 87, 77 created_at: "2022-08-10 13:48:42", 78 updated_at: "2022-08-10 13:48:42", 79 }, 80 ], 81 } 82>>> $fire->retweeted(); 83=> null

試したこと

tinker で $fire = Fire::first(); として、その投稿をリツイートした。そしてリツイートテーブルにもきちんとデータが入っていた。しかしtinkerで$fire->retweeted()としてもnullが帰ってきてしまう。なぜか$fire->hasMany(Retweet::class, 'retweeted_id', 'id')ならきちんと狙い通りの結果が帰ってきた。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2022/08/10 04:58

提示されているのはdd()の結果でしょうか? こちらもマークダウンのcodeにて提示いただいた方が見やすくなるかと思います(テーブル定義部分も)
TakuMa

2022/08/10 05:28

いや、MySQLから下の部分はtinkerで表示しただけですね。
TakuMa

2022/08/10 05:33

fires +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | user_id | bigint(20) unsigned | NO | MUL | NULL | | | content | varchar(255) | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ retweets +---------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | retweeted_id | bigint(20) unsigned | NO | MUL | NULL | | | retweeting_id | bigint(20) unsigned | YES | MUL | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +---------------+---------------------+------+-----+---------+----------------+
m.ts10806

2022/08/10 05:33

なるほど いえ、dd()の結果ぽかっただけで、そこにこだわりがあるわけではなく、あくまでテキストそのままではなく マークダウンで提示してもらった方が見やすくなるので修正してくださいというところを伝えたかったのです。
m.ts10806

2022/08/10 05:34

質問は編集できますし、コメント欄ではマークダウン使えませんので、 本文修正してください。
TakuMa

2022/08/10 05:54

ごめんなさい、やっと意味が分かりました。取り敢えず本文修正しました
m.ts10806

2022/08/10 05:57

いえ、質問初めての方に対してちょっと言い方が遠回し過ぎました。失礼しました。
guest

回答1

0

ベストアンサー

diff

1- $fire->retweeted() 2+ $fire->retweeted

投稿2022/08/10 05:15

phper.k

総合スコア3923

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

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

TakuMa

2022/08/10 05:52

>>> $fire = Fire::find(86); => App\Fire {#4285 id: 86, user_id: 1, content: "2", created_at: "2022-08-10 13:48:41", updated_at: "2022-08-10 13:48:41", } >>> $fire->retweeted; LogicException with message 'App\Fire::retweeted must return a relationship instance, but "null" was returned. Was the "return" keyword used?'
TakuMa

2022/08/10 05:53

エラーが出てしまいます...
phper.k

2022/08/10 06:08

エラーの意味、理解できる?
TakuMa

2022/08/10 06:17

解決しました。return文が入っていませんでした!エラーの意味をよく考えたら理解できました...。ありがとうございました! エラーの意味は「リレーションを表すインスタンスが返ってこないといけないのになんかnull何だけど?return入れた?」だと思いました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問