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

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

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

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

PHP

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

Q&A

解決済

2回答

8439閲覧

Int型で取りたいがnullになってしまう

naoya1212

総合スコア5

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/03/31 02:05

編集2020/03/31 03:09

前提・実現したいこと

laravelでtwitter風のサイトを作っています。
フォローする、フォロー解除の機能を実装中に以下ようなエラーが発生しました。

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

Argument 1 passed to App\Models\User::isFollowing() must be of the type int, null given, called in /home/vagrant/code/Laravel/app/Http/Controllers/UserController.php on line 108

該当のソースコード

\Controller\UserController

//フォロー public function follow(User $user) { $follower = auth()->user(); //フォローしているか $is_following = $follower->isFollowing($user->id); if(!$is_following) { //フォローしていなければする $follower->follow($user->id); return back(); } } //フォロー解除 public function unfollow(User $user) { $follower = auth()->user(); //フォローしているか $is_following = $follower->isFollowing($user->id); if($is_following) { //フォローしていれば解除する $follower->unfollow($user->id); return back(); } }

User.php

//フォローする public function follow(Int $user_id) { return $this->follows()->attach($user_id); } //フォロー解除 public function unfollow(Int $user_id) { return $this->follows()->detach($user_id); } //フォローしているか public function isFollowing(Int $user_id) { return (boolean) $this->follows()->where('followed_id', $user_id)->first(['id']); } //フォローされているか public function isFollowed(Int $user_id) { return (boolean) $this->followers()->where('following_id', $user_id)->first(['id']); }

view\users\index.blade.php

view\users\index.blade.php

1 @if(auth()->user()->isFollowed($user->id)) 2 <div class="px-2"> 3 <span class="px-1 bg-secondary text-light">フォローされています</span> 4 </div> 5 @endif 6 <div class="d-flex justify-content-end flex-grow-1"> 7 @if(auth()->user()->isFollowing($user->id)) 8 <form action="{{ route('unfollow', ['id' => $user->id]) }}" method="POST"> 9 {{ csrf_field() }} 10 {{ method_field('DELETE') }} 11 <button type="submit" class="btn btn-danger">フォロー解除</button> 12 </form> 13 @else 14 <form action="{{ route('follow', ['id' => 15 $user->id]) }}" method="POST"> 16 {{ csrf_field() }} 17 <button type="submit" class="btn btn-primary">フォローする</button> 18 </form> 19 @endif

route

1 Route::post('users/{id}/follow', 'UserController@follow')->name('follow'); 2 Route::delete('users/{id}/unfollow', 'UserController@unfollow')->name('unfollow');

$userをvar_dump

object(App\Models\User)[302] protected 'fillable' => array (size=6) 0 => string 'name' (length=4) 1 => string 'email' (length=5) 2 => string 'password' (length=8) 3 => string 'screen_name' (length=11) 4 => string 'team' (length=4) 5 => string 'profile_image' (length=13) protected 'hidden' => array (size=2) 0 => string 'password' (length=8) 1 => string 'remember_token' (length=14) protected 'casts' => array (size=1) 'email_verified_at' => string 'datetime' (length=8) protected 'connection' => null protected 'table' => null protected 'primaryKey' => string 'id' (length=2) protected 'keyType' => string 'int' (length=3) public 'incrementing' => boolean true

試したこと

User.phpのpublic function isFollowing(Int $user_id)のIntを?Intにしてみましたが、フォローやフォロー解除ができませんでした。
なぜnullになってしまうのか全くわかりませんでした。user_idが取れていまいのでしょうか?

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

laravel 7.3.0
php 7.4.4
Homestead

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

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

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

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

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

guest

回答2

0

ベストアンサー

?をつけたところでnullが渡ればnullです。

php

1<?php 2function test(?int $id){ 3 var_dump($id); 4} 5 6test(null);

まず、dump()なりdd()なり入れて想定通りの情報が渡ってきているか確認してください。

php

1 2 public function follow(User $user) 3 4 { 5 dd($user); 6 7 $follower = auth()->user(); 8 9 //フォローしているか 10 $is_following = $follower->isFollowing($user->id);

user_idが取れていまいのでしょうか?

現状からは「エラーの通り」としか言いようがなかったりします。
$userがどこからどのように取得されて渡されるのか全体の流れが分かるコード、データをご提示ください。

投稿2020/03/31 02:12

編集2020/03/31 02:14
m.ts10806

総合スコア80765

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

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

naoya1212

2020/03/31 02:48

返信ありがとうございます。 $userはログイン中のユーザーデータからとっています。 dd($user)で確認したところ、ログインしているユーザーの情報は取れていることが確認できたので、idは取れていました。User.phpの//フォローしているか//の処理が間違っているのでしょうか?
m.ts10806

2020/03/31 02:54

>ログインしているユーザーの情報は取れていることが確認できた 結果をご提示ください。 データ取れているならモデルの問題ではないはずです。 というか、URLでフォローする・解除するユーザのIDをパラメータとして渡してるならそこからとらないと「自分自身をフォローしてるか」になりませんか?
mepon

2020/03/31 03:57

var_dumpの結果を見た感じだと取得できているように見えないのですが取れてるんですね。 laravelのroute model bindingではrouteのパラメータとcontrollerの引数を一致させる必要があったと認識してますが。 なので$userで受け取りたい場合正しくは Route::post('users/{user}/follow', 'UserController@follow')->name('follow'); では?
naoya1212

2020/03/31 03:58

失礼いたしました。勘違いで、$userにはデータが入っていませんでした。 なので、フォローする、解除するユーザーのI Dを$userに渡したところ解決いたしました。 変数の情報がわからない時は、var_dumpやddをすることで解決に繋がることを実感いたしました。 ありがとうございました。
naoya1212

2020/03/31 04:06

Route::post('users/{user}/follow', 'UserController@follow')->name('follow'); 最初はこのように行ったのですが、 Missing required parameters for [Route: unfollow] [URI: users/{user}/unfollow]. となってしまいましたのでidに変えて行っていました。
naoya1212

2020/03/31 04:12

Route::post('users/{user}/follow', 'UserController@follow')->name('follow'); で、初めは行ったのですが、 Missing required parameters for [Route: unfollow] [URI: users/{user}/unfollow]. となってしまったので{user}をidに変えて行っていました。
m.ts10806

2020/03/31 05:03 編集

おそらく基本的なところかと。 あくまでURIで渡せるのは文字列ですしね。 そこにUserモデルをあてはめようとしてるので不整合が起きてNULLになったということだと思います。(どこにも情報を注入できるタイミングがない) デバッグは必須です。 特にフレームワークとなると様々な情報が開発者が意識しないところで飛び交うので、確実におさえておく必要があります。
naoya1212

2020/03/31 07:02

ご丁寧にありがとうございます。 URIの部分、もっと勉強します。 とても勉強になりました。ありがとうございました。
guest

0

$userにデータが渡っていなかった。

UserController

1//フォロー 2 public function follow(User $user,$id) 3 { 4 $user = User::find($id); 5 //var_dump($user); 6 $follower = auth()->user(); 7 //フォローしているか 8 $is_following = $follower->isFollowing($user->id); 9 if(!$is_following) { 10 //フォローしていなければする 11 $follower->follow($user->id); 12 return back(); 13 } 14 //return view('sample'); 15 }

としたところうまくいきました。

投稿2020/03/31 04:08

naoya1212

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問