Я успешно обновляю данные в моей сводной таблице. Сейчас я пытаюсь вернуть обновленную модель, включая только что обновленные сводные данные.
Я могу вернуть модель, но не знаю, как получить оттуда сводные данные.
Вот мой контроллер:
public function update(Request $request, Role $role)
$user->roles()->updateExistingPivot($attributes['id'], $attributes); // 200 status
...
return response()->json(['role' => $role], 200);
// have also tried this - and does return the value, but would like the whole object if possible.
$active = $user->roles->find($attributes['id'])->pivot->active;
}
Вот моя User
модель:
public function roles(): BelongsToMany
{
return $this->belongsToMany(Role::class, 'role_user', 'user_id')
->withPivot('active') // this is the column I am updating
->withTimestamps();
}
Все выше работает. Мои данные обновляются, как и временные метки в моей сводной таблице.
Проблема, которую я (думаю) я получаю, состоит в том, что я возвращаю тот же $role
, который был передан. Я использую vueкомпонент для отображения результатов, поэтому я хотел бы использовать фактические данные, которые возвращаются из моей базы данных.
Даже если я посмотрю Role
с помощью запроса, я просто получаю модель обратно;не включая сводные столбцы, которые я хотел бы прочитать.
Я проверяю ответ в моем компоненте vue следующим образом:
console.log('response.data', response.data);
response.data {
role:
created_at: "..."
title: "foo"
...
}
Выше приведен тот же объект модели (без столбца сводки). Как я могу прикрепить свой столбец active
pivot к данным ответа? Спасибо за ваши предложения!
РЕШЕНИЕ
Спасибо matticustard за вашу помощь. Это был именно тот толчок, который мне нужен, чтобы указать в правильном направлении. Вот как выглядит мой код в надежде, что он поможет кому-то еще.
controller
$public function update(Request $request, Role $role)
{
$attributes = request()->validate([
'active' => 'required',
'id' => 'required',
]);
$user = auth()->user();
$user->roles()->updateExistingPivot($attributes['id'], $attributes);
// Return the role using the relationship.
$role_with_pivot = $user->roles()->where('role_id', $attributes['id'])->first();
return response()->json(['role' => $role_with_pivot], 200);
}
Вышеприведенное вернет это как ответ после обновления моей базы данных:
role:
created_at: "..."
icon: "..."
id: 1
pivot:
active: true
role_id: 1
user_id: 1
...
title: "foo"
...
vue компонент
<template>
<div class="role" :class="{'active': active}" @click="handleClick($event, role)">
<div v-if="role.icon" class="role-icon">
<i :class="role.icon"></i>
</div>
<div class="role-title">
{{ role.title }}
</div>
</div>
</template>
...
data() {
return {
active: this.role.pivot.active,
}
},
...
methods: {
async handleClick(event, role) {
try {
let response = await axios.patch(`/my-path/${role.id}`, {
active: !this.active,
id: role.id,
});
if (response.status === 200) {
console.log('response.data', response.data);
this.active = response.data.role.pivot.active;
console.log('active: ', this.active);
} else {
console.error('Error: could not update role. ', response);
}
} catch (error) {
console.error('Error: sending patch request. ', error);
}
},
},