Php Laravel编辑浅嵌套资源
我正在使用以下资源使用 获取下表,其中包含两条记录,这是index.blade.php的结果 假设我们想要编辑Php Laravel编辑浅嵌套资源,php,laravel,laravel-blade,laravel-request,Php,Laravel,Laravel Blade,Laravel Request,我正在使用以下资源使用 获取下表,其中包含两条记录,这是index.blade.php的结果 假设我们想要编辑tiagoperes.eu到stackoverflow.com。我会去编辑视图 更改相应字段并单击保存按钮。这就是结果 如您所见,记录未更新 检查控制器更新()中的$request->all() /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $requ
tiagoperes.eu
到stackoverflow.com
。我会去编辑视图
更改相应字段并单击保存按钮。这就是结果
如您所见,记录未更新
检查控制器更新()中的$request->all()
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\OrganizationEmailDomain $emailDomain
* @return \Illuminate\Http\Response
*/
public function update(Request $request, OrganizationEmailDomain $emailDomain)
{
$emailDomain->update($request->all());
return redirect()->route('organizations.emaildomains.index', [
'organization' => $request->organization_id
])->withStatus(__("Org's email domain successfully updated."));
}
以及“网络”选项卡中的表单数据
并将数据发布到
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>
这就是模型(请注意,我使用的表的名称与默认情况下预期的不同-protected$table='email_domains';
)
将模型ID注入路由或控制器操作时,通常会查询数据库以检索与该ID相对应的模型。Laravel路由模型绑定提供了一种方便的方法,可以将模型实例直接自动注入路由。例如,您可以注入与给定ID匹配的整个OrganizationEmailDomain模型实例,而不是注入OrganizationEmailDomain的ID Laravel自动解析路由或控制器操作中定义的雄辩模型,其类型提示变量名称与路由段名称匹配。例如:
use App\OrganizationEmailDomain;
Route::put('emaildomains/{emailDomain}', [OrganizationEmailDomainController::class, 'update']);
那么控制器中应该有以下内容
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\OrganizationEmailDomain $emailDomain
* @return \Illuminate\Http\Response
*/
public function update(Request $request, OrganizationEmailDomain $emailDomain)
{
$emailDomain->update($request->all());
return redirect()->route('organizations.emaildomains.index', [
'organization' => $request->organization_id
])->withStatus(__("Org's email domain successfully updated."));
}
请注意,如果变量名$emailDomain
与路由段{emailDomain}
不同,则laravel将无法解析模型。因此,您将得到一个空的OrganizationEmailDomain模型,它不会更新任何数据。因此,请确保在路由中使用定义的相同名称
要检查哪个是正确的路由名称,请运行命令php artisan route:list
,您将看到路由和段的名称
编辑 为了解决这个问题,我跑了
php artisan route:list
这表明
organizations/{organization}/emaildomains/{emaildomain}| organizations.emaildomains.update
因此,将OrganizationEmailDomainController.php
更改为
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\OrganizationEmailDomainRequest $request
* @param \App\OrganizationEmailDomain $emaildomain
* @return \Illuminate\Http\Response
*/
public function update(OrganizationEmailDomainRequest $request, OrganizationEmailDomain $emaildomain)
{
$emaildomain->update($request->all());
return redirect()->route('organizations.emaildomains.index', ['organization' => $request->organization_id])->withStatus(__("Org's email domain successfully updated."));
}
够了
请注意,唯一需要的更改是在控制器中从
$email\u domain
更改为$emaildomain
,同时还删除了不必要的位以获取组织id,并通过$request使用上面的建议。谢谢您。只要有可能,我们都会提供赏金。
php artisan route:list
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\OrganizationEmailDomainRequest $request
* @param \App\OrganizationEmailDomain $emaildomain
* @return \Illuminate\Http\Response
*/
public function update(OrganizationEmailDomainRequest $request, OrganizationEmailDomain $emaildomain)
{
$emaildomain->update($request->all());
return redirect()->route('organizations.emaildomains.index', ['organization' => $request->organization_id])->withStatus(__("Org's email domain successfully updated."));
}