認証されたユーザーが投稿(またはリンク)を好きかどうかを検証しようとしています。 App\User.php
でauth :: user()がカスタム関数を介してオブジェクトを持っているかどうかの確認に問題があります
(ユーザーが2つの別々のモデルであり、ポストまたはリンクを好きなことができるはずですので)私はuser_id
、likeable_id
とlikeable_type
とlike
モデルを持っている
:
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
>>>
感謝を
->where()
を行ったが、私が書いたコードが働いた後->get()
を行う必要があります。 where() - > get()を使うと、私のために(nullを返す)tihsの状況ではうまくいかないようですが、最後の最初の投稿を編集します。 –問題は私がスコアで並べ替えを実装する方法かもしれないと思う: '' '$ 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(); }); '' ' –