Разбор ответа Laravel на правильный JSON

Я использую Vue с Laravel 5.6 и пытаюсь создать элемент списка. Мой шаблон ниже, проблема в том, что я не могу правильно использовать ответ. В этом примере у меня возвращается один элемент, но в реальных примерах будут партии из 10 элементов. Нужен способ преобразовать тарабарщину в удобочитаемый нормальный JSON

<template>
        <div>
            <tr v-for = "row in list" v-bind:key='row.id'>
                <td align = "left">{{row.list_type_id}}</td>

            </tr>
        </div>
    </template>

        <script>

        export default {
            name: 'List',
            data(){
                return{
                    list:{
                    }
                }
            },
            created() {
                this.getList()
            },
            methods:{
                getList(){
                    let self = this
                    $.ajax({
                        url: '/api/list',
                        success: function(result){
                            self.list = result;
                    }});
                }
            }
        }
        </script>

Это ответ, который я получаю от Laravel;

[{"data":"{\"list_name\":\"STLTV2\",\"device_type_id\":\"6758\",\"entity_id\":\"1072\",\"client_id\":\"msx\"}]

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

Ах, и в моей модели у меня есть

protected $casts = [
    'data' => 'json'
];

Добавление моего контроллера, где я только возвращаю данные

public function index()
{
    return \DB::table('list_items')
        ->join('list', 'list_items.list_id', '=', 'list.id')
        ->where('list.type',3)
        ->limit(1)
        ->select(['data'])
        ->get();

}

Поскольку я ограничиваю возвращаемую запись с помощью limit(10 и выбираю только столбец data, я могу использовать self.list = JSON.parse(result[0]['data']); Я хочу иметь возможность конвертировать data, а также другие поля

{
 'list_id': 1,
 'data': {
     'list_name':'STLTV2',
     ...
  }
}

Добавление модели ListItem

class ListItem extends Model
{

    protected $casts = [
        'data' => 'json'
    ];

    protected $fillable = [
        'list_id',
        'data',
    ];

    public function list()
    {
        return $this->belongsTo(Lists::class, 'list_id', 'id');
    }
}

Добавление модели списков

class Lists extends Model
{
    protected $casts = [
        'view' => 'json',
        'settings' => 'json'
    ];

    public function items()
    {
        return $this->hasMany(ListItem::class);
    }
}

Как вы выводите свой json-контент? Например, покажите код того, какой ответ вы возвращаете.

Tuim 31.01.2019 16:34

вы должны поместить self.list вместо self.form, вы не формируете переменную внутри данных вашего компонента. поэтому не могли бы вы поделиться с нами вашим контроллером, пожалуйста?

Thamer 31.01.2019 16:43

Также добавил свой контроллер.

Jerry Li 31.01.2019 16:53

@JerryLi, как я и ожидал, вы должны реструктурировать возвращаемые данные из контроллера, перед этим не могли бы вы поделиться с нами связью между списком и таблицей list_items, пожалуйста?

Thamer 31.01.2019 17:01

Вы должны использовать Красноречивые ресурсы для вывода правильных ответов JSON.

ceejayoz 31.01.2019 17:05

Спасибо @Thamerbelfkih! Вы имеете в виду это отношение? list_items.list_id', '=', 'list.id'

Jerry Li 31.01.2019 17:07

@JerryLi да, связь между моделями list и list_items, пожалуйста

Thamer 31.01.2019 17:08

@JerryLi, не могли бы вы поделиться со мной всеми полями, которые вы хотите вернуть, пожалуйста?

Thamer 31.01.2019 17:27
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
8
419
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы достичь того, чего вы хотите, вы должны обновить свой метод index, как показано ниже:

здесь мы будем использовать Eloquent для выбора наших данных

public function index()
    {
        // here we get all listItems with list that has type = 3  
        $listItems = ListItem::with('lists' => function($query) {
            $query->where('type',3);
        })->get();

        return $listItems->map(function($item){

            return [
                'list_id' => $item->list_id,
                'list_item_id' => $item->list_item_id,

                 // put here all your data like key => value, and then you can get them from your vue component
                //'key' => value
            ];
        });
    }
$listItems = ListItem::with(['list' => function($query) { $query->where('type',3); }])->get(); нуждается в [], но когда я использую toSql(), я получаю только select * from list_item и все. В миграциях этих двух таблиц нет связи, как вы думаете, в этом причина?
Jerry Li 31.01.2019 18:44

@JerryLi у вас нет внешнего ключа list_id в таблице list_items, пожалуйста?

Thamer 31.01.2019 21:05
$listItems =LisItem::whereHas('lists', function($q) { $q->where('type', '3'); })->get(); return $listItems; решил мою проблему. Спасибо за наводку @Thamer
Jerry Li 31.01.2019 22:28

Лучшим подходом может быть использование ресурсов API для работы с ответом API. https://laravel.com/docs/5.7/eloquent-resources#генерирующие-ресурсы

В вашей индексной функции

public function index()
{
    return return YourResource::collection(YourModel::all());

}

Другие вопросы по теме