2017-10-23 1 views
0

認証されたユーザーが投稿(またはリンク)を好きかどうかを検証しようとしています。 App\User.phpauth :: user()がカスタム関数を介してオブジェクトを持っているかどうかの確認に問題があります

(ユーザーが2つの別々のモデルであり、ポストまたはリンクを好きなことができるはずですので)私はuser_idlikeable_idlikeable_typelikeモデルを持っている

public function likes() { 
    return $this->hasMany('App\Like'); 
} 

public function likedCustom($str) { 
    $likedCustom = new Collection(); 
    $this->likes()->where([ 
     'likeable_type' => $str, 
    ])->each(function ($like) use ($likedCustom) { 
     $likedCustom->push($like->likeable); 
    }); 

    return is_null($likedCustom) ? false: $likedCustom; 
} 

public function likedEntries() { 
    $likedEntries = $this->likedCustom('post'); 
    $links = $this->likedCustom('link'); 
    $links->each(function ($link) use ($likedEntries) { 
     $likedEntries->push($link); 
    }); 

    return is_null($likedEntries) ? false: $likedEntries; 
} 

これは、 App\Post'post'に、App\Link'link'に設定してから完全に正常に動作します。その後、php artisan tinkerを使用すると、1つのコレクション内のすべての投稿とリンクを$entriesとすることができます。したがって、App\User::find(1)->likedEntries()->contains(App\Post::find(1));を実行すると、trueが返されます。

この関数はビューに実装しようとすると、ここから問題が始まります。例えばポストやリンクが認証されたユーザーに好まれている場合:

@foreach ($entries as $entry) 
    @if (Auth::user()->likedEntries()->contains($entry)) 
     <li class="active"> {{ $entry->title }} </li> 
    @else 
     <li> {{ $entry->title }} </li> 
    @endif 
@endforeach 

だから私はそれがdifferentyを返すオブジェクトの原因となることができます推測しました。私はViewComposers\EntryComposer.phpで彼らにこの方法を返すので:

public function compose(View $view) 
{ 
    // $test = Post::all(); 
    $entries = Post::all(); 
    $links = Link::all(); 
    $links->each(function ($link) use ($entries) { 
     $entries->push($link); 
    }); 
    $entries = $entries->sortByDesc(function($entry) { 
     return $entry->score(); 
    }); 
    $view->with('entries', $entries); 
    // $view->with('entries', $test); // Didn't work either. 
} 

私は何をしないのですか?また

Psy Shell v0.8.12 (PHP 7.1.10 — cli) by Justin Hileman 
>>> App\User::find(1)->likedEntries() 
=> Illuminate\Support\Collection {#754 
    all: [ 
     App\Post {#780 
     id: "1", 
     title: "debitis", 
     body: "Quis rerum amet saepe eligendi. Ullam ea consectetur rerum rem repellat qui qui vel. Aspernatur officiis aut tenetur est perspiciatis harum.", 
     user_id: "144", 
     category_id: "3", 
     created_at: "2017-10-23 12:38:34", 
     updated_at: "2017-10-23 12:38:34", 
     }, 
     App\Link {#781 
     id: "1", 
     title: "Numquam consequuntur minima sunt aut vel facilis deleniti et.", 
     url: "https://www.dibbert.info/qui-voluptate-ratione-aperiam-et-ullam-perferendis-et", 
     user_id: "136", 
     category_id: "2", 
     created_at: "2017-10-23 12:38:36", 
     updated_at: "2017-10-23 12:38:36", 
     }, 
    ], 
    } 
>>> App\User::find(1)->likedEntries()->contains(App\Post::find(1)) 
=> true 
>>> 

答えて

0

それは多くに関係のロジックを簡素化し、ユーザーから言っていたオブジェクトを取得するためのあなたが持っている2つのカスタム関数ことだろう、Polymorphic relationsでチェックしてください。

任意の方法は、クエリに

public function likedCustom($str) { 
    return $this->likes()->where('likeable_type', $str)->get()->map(function ($like) { 
     return $like->likeable; 
    }); 
    // This will return a Collection that can be empty, so you 
    // should check against $collection->isEmpty() or ->count() 
}  
+0

感謝を->where()を行ったが、私が書いたコードが働いた後->get()を行う必要があります。 where() - > get()を使うと、私のために(nullを返す)tihsの状況ではうまくいかないようですが、最後の最初の投稿を編集します。 –

+0

問題は私がスコアで並べ替えを実装する方法かもしれないと思う: '' '$ entries = App \ Post :: all(); $ links = App \ Link :: all(); $ links-> each(function($ like)use($ entries){ $ entries-> push($ link); }); $ sortByScore = $ entries-> sortByDesc(function($ entry){ return $ entry-> score(); }); '' ' –

関連する問題