Php Laravel编辑浅嵌套资源

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

我正在使用以下资源使用

获取下表,其中包含两条记录,这是index.blade.php的结果

假设我们想要编辑
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."));
}