2014-01-19 3 views
4

Я недавно экспериментировал с Laravel 4, который до сих пор был радостью в использовании. Тем не менее, я испытываю проблему, а не с Laravel 4, а скорее свою собственную неспособность.Laravel 4 - декодирование json в поле зрения

У меня есть база данных, содержащая 3 строки с 4 столбцами. Например, предположим, что столбцы:

content_id, content_type, content_data, метка времени

'content_data' столбец содержит JSON-кодированный массив около 4 ключевых пар значений.

Когда я извлекаю эти строки из базы данных (используя Eloquent) и передаю данные в свое представление, как я также могу разобрать JSON в свой шаблон клинка?

После поиска и ссылки на документацию Laravel, моя мысль заключается в том, что вы не можете, поэтому я попытался декодировать JSON обратно в массив внутри моего контроллера, а затем передать его в мое представление.

До сих пор я попытался следующим в моем классе:

<?php 
class PageController extends \BaseController { 

public function index() 
{ 

    $data = Content:: 
     ->where('content_type', 1) 
     ->get(); 

    foreach($data as $content) 
    { 
     $items[] = json_decode($content->content_data); 
    } 

    return View::make('pages.page2') 
     ->with('data', $data) 
     ->with('items', $items); 
} 
} 

Однако в моем шаблоне лезвию, когда я запускаю цикл Еогеаспа цикла по извлекаемым строкам, я попытался запустить еще один цикл Еогеаспа в первый, который перебирает массив $ items для извлечения их значений, но поскольку это цикл в цикле, я получаю повторяющиеся значения json.

Мой шаблон лезвие выглядит следующим образом:

@extends('layouts.pages'); 

@section('content_body') 
<h1>My <span>title</span></h1> 

<div class="column col-1"> 
    <ul> 
     {{-- loop through the database rows --}} 
     @foreach($data as $row) 

      {{-- loop through the json decoded values --}} 
      @foreach($items as $item) 

       {{ $item['title'] }} 

      @endforeach 

     @endforeach 
    </ul> 
</div> 
@stop 

Не уверен, что, если я объяснил это правильно, но в основном я просто хочу, чтобы иметь возможность разобрать мой JSON закодированный массив в цикле, который отображает извлеченную дБ строки

Надеюсь, это имеет смысл для тех, кто может помочь.

+0

Попробуйте '$ content-> content_data = json_decode ($ content-> content_data)'. – elclanrs

+0

Итак, вы имеете в виду выполнение цикла foreach в моем контроллере, но вместо назначения json_decoded значений в массив $ items, я должен назначить его $ content-> content_data? –

+0

Я бы попробовал, не знаю, в чем проблема. – elclanrs

ответ

4

Используйте Eloquent Accessor, чтобы преобразовать ваши данные по своему усмотрению.

/** 
* Eloquent accessor to transform our content_data column 
* from JSON to an array. 
* 
* @param string $data Original JSON data 
* @return array 
*/ 
public function getContentDataAttribute($data) 
{ 
    return json_decode($data); 
} 

Вы можете получить свою колонку через $content->content_data, как обычно, но он будет преобразован в массив.

Вы можете сделать инверсию при сохранении данных в этом столбце, преобразовывая переданный массив в кодированную строку JSON, также используя мутатор.

+0

Это сработало отлично, хотя мне потребовалось некоторое время, чтобы окунуться в соглашение об именах аксессуаров и о том, как получить доступ к моему массиву из Blade, но мне это удалось разобраться. В вашем коде btw есть небольшая опечатка, возвращение должно быть 'json_encode'. Большое спасибо всем участникам. –

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