Как вывести отношения определенной модели, чтобы отобразить их в таблице с помощью Inertia::render?
Я пытаюсь получить отношения для модели от контроллера, чтобы иметь возможность отображать отношения не как идентификатор, а как имя или тип этого идентификатора или что-то еще. В этом случае я пытаюсь получить информацию, относящуюся к вопросу, типу ответа (текст, множественный, ранг, да или нет), а также к какому разделу принадлежит (имя)
Пока это мой код контроллера
public function index()
{
return Inertia::render('Question/Index', [
'survey_question' => SurveyQuestion::all(),
'survey_section' => SurveySection::all(),
'response_type' => ResponseType::all()
]);
}
Таблица в vue
<el-table
:data="tableData">
<el-table-column
prop="question"
label="Pregunta">
</el-table-column>
<el-table-column
label="Seccion">
<template slot-scope="scope">
<p> {{ scope.row.survey_section.title }} </p>
</template>
</el-table-column>
<el-table-column
label="Tipo de Respuesta">
<template slot-scope="scope">
<p> {{ scope.row.response_type.type }} </p>
</template>
</el-table-column>
<el-table-column
prop="optional"
label="Opcional">
</el-table-column>
<el-table-column>
<template slot-scope="scope">
<div class="btn-link-edit action-button" @click="edit(scope.row)">
<i class="fas fa-pencil-alt"></i>
</div>
<div class="btn-link-delete action-button" @click="delete(scope.row)">
<i class="fas fa-trash"></i>
</div>
</template>
</el-table-column>
</el-table>
Это приносит отношения, которые я думаю, потому что, когда я создаю новый вопрос, у меня есть опция выбора, и она показывает имена вместо идентификаторов, но когда я пытаюсь отобразить это имя в таблице, я могу получить доступ только к идентификатору.
Я также хотел бы знать, как отображать для необязательного поля вместо 0 или 1, да или нет. Это поле является логическим в структуре таблицы, если это важно.
Если я сделаю {{ scope.row }}
тогда я получаю информацию, но только о таком вопросе
{ "id": 1, "question": "asdfasdf", "survey_section_id": 1, "response_type_id": 1, "optional": 1 }
Я бы хотел, чтобы когда я {{ scope.row }}
Я также получаю из этих идентификаторов другой массив с информацией, относящейся к этому идентификатору, как из раздела, так и из типа ответа.
2 ответа
Как говорит Иосиас, вы должны использоватьwith
метод.
Лучшей практикой в laravel является возврат красноречивых данных, а затем вызов их вdefineProps
использовать с vue/inertia
Допустим, у вас есть модель, которая принадлежитclients
, и вы хотите проиндексировать все устройства сclient.name
. В вашем контроллере вы вернете все устройства с клиентскими отношениями следующим образом.
public function index()
{
$devices = Device::with(['client'])->get();
return Inertia::render('Devices/Index', compact(['devices']));
}
Затем в vue Devices/Index вам просто нужно объявитьdevices
вdefinedProps
нравиться
defineProps(['devices']);
то можно сделать простойv-for
заявление
<script setup>
import { Head } from '@inertiajs/inertia-vue3';
import { Inertia } from "@inertiajs/inertia";
defineProps(['devices']);
</script>
<template>
<div>
<table>
<thead>
<th>
Client
</th>
<th>
Name
</th>
<th>
Model
</th>
<th>
Year
</th>
</thead>
<tbody>
<tr v-for="device in devices" :key="index">
<td>
{{ device.client.name }}
</td>
<td>
{{ device.name }}
</td>
<td>
{{ device.model }}
</td>
<td>
{{ device.year }}
</td>
</tr>
</tbody>
</table>
</div>
</template>
Вы должны использовать
with
метод в красноречивой модели. Например:
$result = Model::with(['nameOfTheRelationShip'])->get();