【问题标题】:Many to many realtionship with resource controller without model laravel与没有模型 laravel 的资源控制器的多对多关系
【发布时间】:2020-12-24 17:56:09
【问题描述】:

我是一个新的 php 程序员,我刚开始使用 laravel,我正在尝试构建一个库应用程序,目前我正在处理贷款部分。基本上我有一个名为 copy_user 的数据透视表,其中包含以下列: ('copy_id', 'user_id', 'date', 'return_date', 'created_at', 'updated_at') copy_id 是其中之一可以链接到 books 表中的书的副本。基本上我在用户模型上我有这个代码:

public function loanedCopies() {
        return $this->belongsToMany(Copy::class)->withPivot('date', 'return_date');
    }

在复制模型上我有:

public function loaningUsers() {
        return $this->belongsToMany(User::class)->withPivot(['date', 'return_date']);
    }

我为贷款创建了一个视图,它将显示表 copy_user 的内容,所以我还创建了一个 LoanController 和一个使用资源控制器的路由:


Route::resource('loans', LoanController::class);

现在我要做的是通过使用资源而不使用模型来删除或编辑 copy_user 表上的记录,我正在尝试这样做:

视图上的代码:


<form action="/loans/{{$copy->id}}?user_id={{$user->id}}&date={{$copy->pivot->date}}" method="POST">
          @csrf
          @method('DELETE')
          <button type="submit" class="btn btn-link"><i class="fas fa-trash-alt"></i></button>
</form>

控制器中的代码:

public function destroy(Copy $copy)
    {
        $request = Request::capture();
        $request->get('user_id');
        $request->get('date');
        $copy->loaningUsers()->where('id', $request->get('user_id'))->wherePivot('date', $request->get('date'))->detach();
        return redirect('/loans');
    }

现在的问题是 destroy 方法没有接收任何数据,因此它没有删除任何内容。我被明确告知不要使用贷款模型,但我不知道这是否可能。使用资源控制器是我的决定,但我不知道这是否是正确的方法,有没有人知道为什么这不起作用?提前感谢每一位愿意回答的人!

【问题讨论】:

    标签: php laravel many-to-many eloquent-relationship


    【解决方案1】:

    由于您的资源被命名为贷款,destroy 方法将期望您使用 $loan 作为它的参数来绑定数据。

    Route::resource('loans', LoanController::class); //This expects you to pass $loan
    
    
    public function destroy(Copy $loan) { //Switch from $copy to $loan
    
    }
    

    您还可以通过以下方式检查路线来验证这一点:

    php artisan route:list
    

    【讨论】:

      【解决方案2】:

      谢谢 Vimona,刚刚回到那个项目,我放弃了资源控制器,通过执行以下操作转而支持贷款的正常路由:

      Route::get('/loans', 'App\Http\Controllers\LoanController@index');
      Route::delete('/loans/{copy}', 'App\Http\Controllers\LoanController@destroy');
      

      在控制器上,我将方法保持原样:

      public function destroy(Copy $copy)
      {
          $request = Request::capture();
          $request->get('user_id');
          $request->get('date');
          $copy->loaningUsers()->where('id', $request->get('user_id'))->wherePivot('date', $request->get('date'))->detach();
          //$copy->loaningUsers()->detach();
          return redirect('/loans');
      }
      

      现在删除方法可以正常工作,希望我没有犯任何错误,如果是,请告诉我,以便我尝试修复它!

      【讨论】:

        猜你喜欢
        • 2021-01-27
        • 1970-01-01
        • 2018-08-18
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        相关资源
        最近更新 更多