Как использовать эту связь в Laravel Inertia JS?

Моя пользовательская модель:

public function role() {
    return $this->belongsTo(Role::class);
}

Моя ролевая модель:

public function count() {
    return User::where('role_id', $this->id)->count();
}

Я хочу узнать, сколько пользователей имеют определенную роль в моем компоненте Index.vue. Когда я набираю Tinker:

$role = Role::find(1); 
$role->count();
Output: 1 -> because I have one user with a role with ID 1

Мой компонент Vue:

<li v-for = "role in roles">Role name: {{ role.name }}</li>
<li>Role count: {{ role.count}}</li>

Но это не работает, как планировалось.

Мой RoleController, где я передал переменную «роли» компоненту Index.vue:

public function index()
{
    return Inertia::render('Roles/Index', [
        'roles' => Role::all(),
    ]);
}

Я хочу отобразить это так:


Имя роли: Администратор

Количество ролей: 1


Имя роли: Подписчик

Количество ролей: 5

какую ошибку вы получаете? в чем собственно проблема?

KGG 01.01.2023 10:42

когда я делаю {{role.count}}, он ничего не печатает

php_dev 01.01.2023 12:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

если count не является столбцом в таблице ролей, вам нужно будет передать эти данные в Vue, в отличие от лезвия, Vue не имеет доступа к методам модели/коллекции

Я всегда использую ресурсы для преобразования моих данных в мой внешний интерфейс javascript. смотрите документацию https://laravel.com/docs/9.x/eloquent-resources

РольРесурс

 return [
        'id' => $this->id,
        'name' => $this->name,
        'email' => $this->role()
        // .... 
    ];

сейчас

public function index()
{
    return Inertia::render('Roles/Index', [
        'roles' => RoleResource::collection(Role::all()); //remember to import RoleResource
    ]);
}

Проверьте, помогает ли это

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

Я нашел решение для этого: Вам нужно вернуть коллекцию внутри вашего контроллера:

 return Inertia::render('Roles/Index', [
        'roles' => RoleResource::collection(Role::all()),
 ]);

Затем создайте RoleResource.php с помощью команды: php artisan make:resource RoleResource

И, наконец, внутри вашего RoleResource верните это:

return [
        'id' => $this->id,
        'name' => $this->name,
        'count' => User::where('role_id', $this->id)->count(),
];

Внутри вашего файла Index.vue добавьте «роли» в качестве реквизита как объект, например: props: {roles: Object}

И foreach ваши роли:

<tr v-for = "role in roles.data">
{{role.id}} // This will print your role id
{{role.name}} // This will print your role name
{{role.count}} // This will print how much users have that role
</tr>

Конечный результат:

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