Я использую 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);
}
}
вы должны поместить self.list вместо self.form, вы не формируете переменную внутри данных вашего компонента. поэтому не могли бы вы поделиться с нами вашим контроллером, пожалуйста?
Также добавил свой контроллер.
@JerryLi, как я и ожидал, вы должны реструктурировать возвращаемые данные из контроллера, перед этим не могли бы вы поделиться с нами связью между списком и таблицей list_items, пожалуйста?
Вы должны использовать Красноречивые ресурсы для вывода правильных ответов JSON.
Спасибо @Thamerbelfkih! Вы имеете в виду это отношение? list_items.list_id', '=', 'list.id'
@JerryLi да, связь между моделями list и list_items, пожалуйста
@JerryLi, не могли бы вы поделиться со мной всеми полями, которые вы хотите вернуть, пожалуйста?

Чтобы достичь того, чего вы хотите, вы должны обновить свой метод 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 и все. В миграциях этих двух таблиц нет связи, как вы думаете, в этом причина?
@JerryLi у вас нет внешнего ключа list_id в таблице list_items, пожалуйста?
$listItems =LisItem::whereHas('lists', function($q) { $q->where('type', '3'); })->get(); return $listItems; решил мою проблему. Спасибо за наводку @Thamer
Лучшим подходом может быть использование ресурсов API для работы с ответом API. https://laravel.com/docs/5.7/eloquent-resources#генерирующие-ресурсы
В вашей индексной функции
public function index()
{
return return YourResource::collection(YourModel::all());
}
Как вы выводите свой json-контент? Например, покажите код того, какой ответ вы возвращаете.