【问题标题】:updateExistingPivot won't workupdateExistingPivot 不起作用
【发布时间】:2016-08-19 18:25:22
【问题描述】:

我正在尝试使用->withPivot 方法更新我的数据透视表approve_document,其中有一个额外的列isApprove

型号:

文档

class Document extends Model
{
  public function sentToApprovers()
  {
    return $this->belongsToMany('App\Models\Approve', 'approve_document')->withPivot('isApprove');
  }
}

批准

class Approve extends Model
{
  public function createdpendingDocuments()
  {
    return $this->belongsToMany('App\Models\Document', 'approve_document')->withPivot('isApprove');
  }
}

这是我在 approve_document 中获取所有记录的地方。

控制器:

public function documentsSentForApproval()
{
    $pendingDocumentLists = DB::table('approve_document')
    ->select('documents.title', 'documents.content', 'categories.category_type', 'users.username', 'approve_document.dateReceived', 'documents.id', 'approves.approver_id')
    ->join('documents', 'documents.id', '=', 'approve_document.document_id')
    ->join('categories', 'categories.id', '=', 'documents.category_id')
    ->join('approves', 'approves.id', '=', 'approve_document.approve_id')
    ->join('users', 'users.id', '=', 'approves.approver_id')
    ->where('approver_id', '=', Auth::id())
    ->orWhere('requestedBy', '=', Auth::id())
    ->get();


    return view ('document.pending')
    ->with('pendingDocumentLists', $pendingDocumentLists);
}

查看:

@foreach ($pendingDocumentLists as $list)
    <tr class = "info">

        <td>{{ $list->title }}</td>
        <td>{{ strip_tags(substr($list->content, 0, 50)) }} {{ strlen($list->content) > 50 ? "..." : '' }}</td>
        <td>{{ $list->category_type }}</td>
        <td>{{ $list->username }}</td>
        <td>{{ date('M, j, Y', strtotime($list->dateReceived)) }}</td>
                    <td>

            @if (Auth::id() == $list->approver_id)

               <a href = "{{ route ('document.pending', $list->id) }}">
                   <button type = "submit" class = "btn btn-success glyphicon glyphicon-thumbs-up"> Approve</button>
                </a>

            @endif

        </td>
        <td></td>

    </tr>
@endforeach

您可以在此处看到我有一个批准按钮,当单击该按钮时,我需要将 isApprove 设置为 true。可以看到点击按钮时我获取到了当前文档的id。

控制器的这一部分,我很难更新我的数据透视表。它给了我一个错误MethodNotAllowedHttpException。任何提示或帮助将不胜感激!

public function updateIsApprove($id)
{
    $document = new Document();

    foreach ($document as $update)
    {
        $approve = new Approve();   

        $document->sentToApprovers()->updateExistingPivot([$approve->id => ['isApprove' => '1']],false);
    }


    return redirect()->route('document.pending');
}

路线:

Route::post('/documents/pending/approve/{id}',
[
   'uses' => '\App\Http\Controllers\DocumentController@updateIsApprove',
   'as' => 'document.pending',
]);

【问题讨论】:

    标签: php laravel eloquent laravel-5.2 pivot-table


    【解决方案1】:
    public function updateExistingPivot($id, array $attributes, $touch = true)
    

    第一个参数应该是相关事物的id。

    【讨论】:

    • 这是可选的吗?我在 Laravel 文档中没有找到任何内容。
    • 必填项。看我的例子: $comany->members()->updateExistingPivot($member->id, ['is_admin' => true]);
    • 我没有发现您的代码有任何问题,但我尝试关注但没有任何反应,它没有更新到我的数据透视表中。
    • 告诉我你想用你的方法做什么。查看 $approve - 您创建了新实例,因此 $approve->id 为空。与 $document 相同。如果您创建了新实例,那么它与任何东西都没有关系。
    • 关于你的错误:MethodNotAllowedHttpException。您定义了发布路线并创建了 (...) (GET)。您应该将您的路由定义从 post 更改为使用 method="post" 获取或创建表单。
    【解决方案2】:
    public function updateIsApprove($documentId, $approveId)
    {
    $document = Document::find($documentId);
    
    if (!$document) {
        // Handle error that document not exists.
    }
    
    $approve = $document->sentToApprovers()->find($approveId);
    
    if (!$approve) {
        // Handle that approve not exists or is not related with document.
    }
    
    $document->sentToApproves()->updateExistingPivot($approve->id, ['isApprove' => 1]);
    
    return redirect()->route('document.pending');
    }
    

    【讨论】:

    • 我收到一个错误,我想我错过了什么?它说Missing argument 2 for App\Http\Controllers\DocumentController::updateIsApprove()我在这里缺少什么论据?
    • 你没有参数 2 :D 你需要在路由中指定它。
    • 我的路线是这样的。 Route::get('/documents/pending/approve/{id}', [ 'uses' =&gt; '\App\Http\Controllers\DocumentController@updateIsApprove', 'as' =&gt; 'document.pending', ]);我错过了什么吗?
    • 我确实以这种方式尝试过。 /documents/pending/approve/{$documentId}/{$approveId}。但我有一个错误。 Missing required parameters for [Route: document.pending] [URI: documents/pending/approve/{$documentId}/{$approveId}]
    【解决方案3】:

    MethodNotAllowedHttpException 不适用于您的控制器,但适用于您的Route。如您所见,在您的 Routes 文件中,您有 Route 用于处理 POST 请求,但在您看来,您是通过直接访问 URL 来发出 GET 请求。
    因此,只需在 Routes 文件中将 POST 路由更改为 GET

    Route::get('/documents/pending/approve/{id}',
    [
       'uses' => '\App\Http\Controllers\DocumentController@updateIsApprove',
       'as' => 'document.pending',
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-24
      • 2021-02-13
      • 1970-01-01
      • 2016-08-10
      • 2017-02-09
      • 1970-01-01
      • 2021-03-18
      • 2016-03-13
      相关资源
      最近更新 更多