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

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

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

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

Laravel 5

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

Q&A

解決済

1回答

567閲覧

User.phpに書かれているメソッドにアクセスできない。

1042limit

総合スコア29

PHP

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

Laravel 5

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

0グッド

1クリップ

投稿2018/04/11 13:52

前提・実現したいこと

Laravel5.5でログインしたユーザーにお気に入りボタンを表示する機能を開発しております。
show.blade.phpにfavolite_botton.blade.phpを読み込んで表示させたいと思っております。
そこでAuthチェックし、 @if (($user)->is_favoliting)のところでUser.phpにfavolitingが記載されているのにも関わらずエラーが出てしまいます。
ご助力のほどよろしくお願い申し上げます。

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

Undefined property: Illuminate\Auth\SessionGuard::$is_favoliting (favolite_botton.blade.php)

該当のソースコード

PHP

1@if (Auth::check()) 2 @if (($user)->is_favoliting) 3 {!! Form::open(['route' => ['user.unfavolite', $user->id], 'method' => 'delete']) !!} 4 {!! Form::submit('Unfavolite', ['class' => "btn btn-danger btn-block"]) !!} 5 {!! Form::close() !!} 6 @else 7 {!! Form::open(['route' => ['user.favolite', $user->id]]) !!} 8 {!! Form::submit('Favolite', ['class' => "btn btn-primary btn-block"]) !!} 9 {!! Form::close() !!} 10 @endif 11@else 12 ログインなし 13@endif

User.php

PHP

1public function favolites() 2 { 3 return $this->belongsToMany(User::class, 'favolites', 'user_id', 'school_id')->withTimestamps(); 4 } 5 6 public function favolite($userId) { 7 8$exist = $this->is_favoliting($userId); 9 10$its_me = $this->id == $userId; 11 12 if ($exist || $its_me) { 13 14 return false; 15 16 } else { 17 18 19 $this->favolitings()->attach($userId); 20 21 return true; 22 23 } 24} 25 26public function unfavolite($userId) 27{ 28 $exist = $this->is_favoliting($userId); 29 // 自分自身ではないかの確認 30 $its_me = $this->id == $userId; 31 32 if ($exist && !$its_me) { 33 $this->favolitings()->detach($userId); 34 return true; 35 } else { 36 return false; 37 } 38} 39 40public function favoliting ($userId) { 41 return $this->favolitings()->where('favolite_id', $userId)->exists(); 42}

試したこと

@if後にdd($user)を挿入

SessionGuard {#264 ▼ #name: "user" #lastAttempted: null #viaRemember: false #session: Store {#244 ▶} #cookie: CookieJar {#242 ▶} #request: Request {#42 ▶} #events: Dispatcher {#26 ▶} #loggedOut: false #recallAttempted: false #user: User {#274 ▼ #fillable: array:3 [▶] #hidden: array:2 [▶] #connection: "mysql" #table: null #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:7 [▼ "id" => 1 "name" => "user2" "email" => "user2@user.com" "password" => "$2y$10$yo4zNCkH2M.VJgAayNTnHehSAxCjqHiA/hvmb3IfC.QcnTHOueoOy" "remember_token" => null "created_at" => "2018-04-10 14:41:32" "updated_at" => "2018-04-10 14:41:32" ] #original: array:7 [▶] #changes: [] #casts: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: [] #touches: [] +timestamps: true #visible: [] #guarded: array:1 [▶] #rememberTokenName: "remember_token"``` ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

@if (($user)->is_favoliting)のところでUser.phpにfavolitingが記載されているのにも関わらずエラーが出てしまいます。

当たり前だと思います。 favoliting というリレーションメソッドが定義されていたらリレーションプロパティの名前も favoliting が正しいです。 is_favoliting ではありません。

しかも, favoliting はリレーションメソッドじゃないですね。この中でリレーションメソッドは favolites ただ1つしかありません。ほかのメソッドはプロパティ形式ではアクセスできません。普通にメソッドとして実行してください。(但しプロパティのように結果はキャッシュされません,その都度実行されます)


【余談】

英語的には favoliting じゃなくて favoriting じゃないですかね…

詳細よく分かんないんですが,もし「ユーザがユーザをお気に入りに入れる」という関係であれば,私なら以下のように書くと思います。(カラム名もそれに合わせて変えます)

php

1class User extends Model 2{ 3 public function favorites() 4 { 5 return $this->belongsToMany(User::class, 'favorites', 'source_user_id', 'target_user_id')->withTimestamps(); 6 } 7 8 public function favorite(User $user) 9 { 10 if ($this->id === $user->id) { 11 return false; 12 } 13 return (bool)$this->favorites()->syncWithoutDetaching([$user->id])['attached']; 14 } 15 16 public function unfavorite(User $user) 17 { 18 if ($this->id === $user->id) { 19 return false; 20 } 21 return (bool)$this->favorites()->detach([$user->id]); 22 } 23 24 public function favoriting(User $user) 25 { 26 return $this->favorites()->wherePivot('target_user_id', $user->id)->exists(); 27 } 28}

投稿2018/04/11 18:57

編集2018/04/11 19:26
mpyw

総合スコア5223

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

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

1042limit

2018/04/13 08:33

返信が遅れてしまい、申し訳ありません。 書いていただいたコードを参考に修正して @if ($user->favoliting($school->id))にしたら通るようになりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問