2016-10-13 5 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. Это Eloquent Model, который имеет следующую $casts свойство определяется:

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

Из-за этого, когда вы получаете доступ $notification->data, он автоматически будет наложено на массив.

Чтобы решить проблему и сократить количество запросов к базе данных, необходимо просто создать отдельный сборник сообщений и передать его в представление.

Сначала создайте массив из всех идентификаторов Post. Затем запустите один запрос, чтобы получить все Post | s для этих идентификаторов. После этого повторно введите полученный результат CollectionPost | s идентификатором, чтобы упростить его поиск в представлении. Не забудьте передать Collection из Post | s на представление.

$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

Гений! Благодаря! –

-1

Вы не обновлялись в $ уведомлениях, поэтому вы видите старый массив, а не новый объект, который вы хотите сохранить.

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

Это ничего не меняет. Результатом остается массив, а не объект модели «Post». –

Смежные вопросы