Как вывести отношения определенной модели, чтобы отобразить их в таблице с помощью 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();
Другие вопросы по тегам