2016-10-13 10 views
0

私は(ビューで表示するための)notification'sデータを更新しようとしている:私は私の見解では、これを行うときオブジェクトが配列に変換されていますか?

$notifications = $user->notifications()->paginate(15); 

foreach ($notifications as $notification) 
{ 
    $post = Post::where('id', $notification->data['post_id']) 
     ->first(); 
    $notification->data = $post; 
} 

しかし:

@foreach ($notifications as $notification) 
    {{ gettype($notification->data) }} 
@endforeach 

それはデータがあることを示していますアレイ。なぜPostモデルオブジェクトを配列に変換するのですか?これをどうやって止めることができますか?

+0

よりもむしろポストを取得するたびに通知をループしてデータベースを照会、あなたが関係して積極的なロードを使用する必要があります。それで '$ notification-> post'を実行するだけです。 – Sacha

+0

さて、Laravelの通知システムを使って、どうすればいいですか? –

答えて

0

あなた$notificationオブジェクトはIlluminate\Notifications\DatabaseNotificationのインスタンスです。これは、次の$casts性質を持っている雄弁Modelが定義されています。このため

protected $casts = [ 
    'data' => 'array', 
    'read_at' => 'datetime', 
]; 

、あなたが$notification->dataにアクセスすると、それは自動的に配列にキャストされます。

問題を解決し、データベースクエリの数を減らすには、別々のポスト検索コレクションを作成してビューに渡すだけです。

まず、PostすべてのIDの配列を作成します。次に、1つのクエリを実行して、それらのIDのすべてのPostを取得します。その後、結果のCollectionPost | sに、後で簡単に参照できるようにIDを再入力します。 CollectionPost)を必ずビューに渡してください。

$notifications = $user->notifications()->paginate(15); 

$postIds = []; 
foreach ($notifications as $notification) { 
    $postIds[] = $notification->data['post_id']; 
} 

$posts = Post::whereIn('id', array_unique($postIds))->get()->keyBy('id'); 

次に、あなたのビューで:

@foreach ($notifications as $notification) 
    {{ $posts->get($notification->data['post_id']) }} 
@endforeach 
+0

Genius!ありがとう! –

-1

$通知で更新していないため、保存したい新しいオブジェクトではなく古い配列が表示されています。

foreach ($notifications as $key => $notification) 
{ 
    $post = Post::where('id', $notification->data['post_id'])->first(); 
    $notifications[$key]->data = $post; 
} 
+0

これは何も変わりません。出力はまだ配列であり、 'Post'モデルオブジェクトではありません。 –

関連する問題