PHP Laravel 4 Массив во вложенный JSON

#php #laravel #laravel-4

#php #ларавель #laravel-4

Вопрос:

Я использую Laravel 4 . Я нахожусь на начальном этапе, поэтому я не полностью осведомлен об особенностях PHP , а также Laravel о фреймворке.

У меня есть массив, который извлекается из таблицы, как показано ниже :

 $result = model::all(); 
 

это дает :

 [0]=>[
       [id]=>1
       [name]=>"abc"
       [description]="temp"
       [tempfield1]="t1"
       [tempfield2]="t2"
       [tempfield3]="t3"
]
[1]=>[
       [id]=>1
       [name]=>"xyz"
       [description]="temp2"
       [tempfield1]="t21"
       [tempfield2]="t22"
       [tempfield3]="t23"
]
... and so on. 
 

Теперь я хочу сгенерировать JSON из этого массива примерно так :

 "items":[{
    "id": 1, 
    "name":"abc", 
    "description":"temp",
    "temps":[{
            "temp1":"t1", 
            "temp2":"t2", 
            "temp3":"t3", 
           }]
    }, 
    {
    "id": 2, 
    "name":"xyz", 
    "description":"temp2",
    "temps":[{
            "temp1":"t21", 
            "temp2":"t22", 
            "temp3":"t23", 
           }]
    }
    ... and so on
]
 

Для достижения этой цели я создал класс элементов, который имеет свойства Id, name и description.

 Class Item{
   public $id; 
   public $name; 
   public $description; 
}
 

Также был создан временный класс, который расширяет класс элемента и имеет свойства temp1, temp2 и temp3.

 Class Temp extends Item{
   public $temp1; 
   public $temp2; 
   public $temp3; 
}
 

Моя идея состоит в том, чтобы создать список типов class Temp и создать foreach цикл, который извлекает каждую запись из приведенного выше массива и заполняет объект Temp класса соответствующими свойствами, а затем я добавлю этот объект в список. Например,

 $list = array(); 

foreach ($result as $row){

     $objTemp = new Temp(); 
     $objTemp->id = $row["id"]; 
     $objTemp->name = $row["name"]; 
     $objTemp->description= $row["description"]; 
     $objTemp->temp1= $row["tempfield1"];       
     $objTemp->temp2= $row["tempfield2"];       
     $objTemp->temp3= $row["tempfield3"];       

     list->push($objTemp);
}
 

И тогда моей идеей было преобразовать список в JSON. Но мне не удалось этого добиться. Даже print_r($objTemp) дает мне список в виде плоской структуры, а не с вложенными временными полями.

Кто-нибудь может помочь мне получить вложенный JSON, используя этот плоский массив, пожалуйста?

Заранее благодарю..

Комментарии:

1. Я думаю, что для Laravel пока нет доступных экспертов по переполнению стека. .NET лучше, чем Laravel.

Ответ №1:

В вашем контроллере просто поместите:

 return Response::json($result);
 

Но вы должны определить связь между Item и temp (что-то вроде):

 Class Item extends Eloquent{
   public $id; 
   public $name; 
   public $description; 

    public function temps()
    {
        return $this->hasMany('Temp','user_id', 'user_id');
    }
}
 

Комментарии:

1. ОК. Но в этом случае, где я должен заполнить объект «Temp» элементами array ()?

2. Ну, я думаю, вам следует сохранить во временных «id» и «name» (или аналогичных) и нормализовать свою базу данных (даже если вы знаете, что храните максимум 3 временных параметра) мое мнение

3. Для меня это невозможно, так как я хочу создать больше классов, расширяющих класс элементов, имеющих одинаковые свойства Name, Id и Описание, но разные в каждом классе.

4. Тогда вы должны определить каждое свойство (имя, идентификатор, описание) для каждого класса, ничего страшного