Я использую следующий ресурс, используя неглубокое вложение
Route::resource('organizations.emaildomains', 'OrganizationEmailDomainController', ['except' => ['show']])->shallow();
Получил следующую таблицу с двумя записями, которая является результатом index.blade.php
Допустим, мы хотим изменить tiagoperes.eu
на stackoverflow.com
. Я бы пошел в режим редактирования
измените соответствующее поле и нажмите кнопку «Сохранить». Это результат
Как видите, запись не обновляется.
Проверка $request->all()
в update() контроллера
и данные формы на вкладке сети
и данные отправляются на
http://localhost/app/public/emaildomains/7
который соответствует URI в неглубокой вложенности.
В edit.blade.php у меня есть следующая форма для обработки обновлений
<form method="post" action="{{ route('emaildomains.update', ['emaildomain' => $email_domain->id]) }}" autocomplete="off">
@csrf
@method('put')
<h6 class="heading-small text-muted mb-4">{{ __('Email Domain information') }}</h6>
<div class="pl-lg-4">
<div class="form-group{{ $errors->has('organization_id') ? ' has-danger' : '' }}">
<label class="form-control-label" for="input-organization_id">{{ __('Organization') }}</label>
<select name="organization_id" id="input-organization" class="form-control{{ $errors->has('organization_id') ? ' is-invalid' : '' }}" placeholder="{{ __('Organization') }}" required>
@foreach ($organizations as $organization)
<option value="{{ $organization->id }}" {{ $organization->id == old('organization_id', $email_domain->organization->id) ? 'selected' : '' }}>{{ $organization->name }}</option>
@endforeach
</select>
@include('alerts.feedback', ['field' => 'organization_id'])
</div>
<div class="form-group{{ $errors->has('email_domain') ? ' has-danger' : '' }}">
<label class="form-control-label" for="input-email_domain">{{ __('Email Domain') }}</label>
<input type="text" name="email_domain" id="input-email_domain" class="form-control{{ $errors->has('email_domain') ? ' is-invalid' : '' }}" placeholder="{{ __('Email Domain') }}" value="{{ old('email_domain', $email_domain->email_domain) }}" required autofocus>
@include('alerts.feedback', ['field' => 'email_domain'])
</div>
<div class="text-center">
<button type="submit" class="btn btn-success mt-4">{{ __('Save') }}</button>
</div>
</div>
</form>
а вот методы редактирования и обновления в OrganizationEmailDomainController
/**
* Show the form for editing the specified resource.
*
* @param \App\OrganizationEmailDomain $email_domain
* @return \Illuminate\Http\Response
*/
public function edit(Request $request, OrganizationEmailDomain $email_domain, Organization $model)
{
$path = $request->path();
$id = (int)explode('/', $path)[1];
$emailDomain = OrganizationEmailDomain::find($id);
return view('organizations.emaildomains.edit', ['email_domain' => $emailDomain->load('organization'), 'organizations' => $model::where('id', $emailDomain->organization_id)->get(['id', 'name'])]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\OrganizationEmailDomain $email_domain
* @return \Illuminate\Http\Response
*/
public function update(Request $request, OrganizationEmailDomain $email_domain)
{
$email_domain->update($request->all());
$organization_id = (int)$request->all()['organization_id'];
return redirect()->route('organizations.emaildomains.index', ['organization' => $organization_id])->withStatus(__("Org's email domain successfully updated."));
}
и это модель (обратите внимание, я использую таблицу с именем, отличным от ожидаемого по умолчанию - protected $table = 'email_domains';
)
class OrganizationEmailDomain extends Model
{
protected $fillable = [
'email_domain', 'organization_id'
];
protected $table = 'email_domains';
/**
* Get the organization
*
* @return \Organization
*/
public function organization()
{
return $this->belongsTo(Organization::class);
}
}