【问题标题】:Laravel - Method delete does not existLaravel - 方法删除不存在
【发布时间】:2021-10-30 18:18:29
【问题描述】:

我收到了错误:

Macroable.php 第 74 行中的 BadMethodCallException:方法删除确实 不存在。

路线:

Route::resource('posts', 'PostController');

我的控制器:

public function destroy($id)
{
    $user_id = Auth::user();
    $post= Post::where('id', $id)->where('user_id',$user_id)->get();
    $post->delete();

    return view('/home', [
        'posts' => $post
    ]);
}

查看:

  <form action="{{ route('posts.destroy', '$post->id') }}" method="post">
  <input type="hidden" name="_method" value="DELETE" />
      {{ csrf_field() }}
       {{ method_field('DELETE') }}

   <input type="submit" class="btn btn-danger" value="delete" />
  </form>

我尝试将method="post" 更改为delete:错误消失但没有任何内容被删除..

【问题讨论】:

  • 你使用的是哪个版本的 Laravel?
  • @agu laravel 5.4
  • 您确定$post 是模型而不是空值或集合吗?

标签: php laravel


【解决方案1】:

这是你的代码。

$user_id = Auth::user();
$post= Post::where('id', $id)->where('user_id',$user_id)->get();
$post->delete();

只需在删除之前添加-&gt;each(),就像这样,

$post->each->delete();

它对我有用。

【讨论】:

【解决方案2】:

去掉 get() 就可以了

$post= Post::where('id', $id)->where('user_id',$user_id);
$post->delete();

If you want to delete first document you can use : 

$post= Post::where('id', $id)->where('user_id',$user_id)->first();
    $post->delete();

但是,您总是需要检查 $post 是否作为查询文档或其 null 被添加:

if($post){
$post->delete();
}

【讨论】:

  • 但是他没有帖子,只是一个查询生成器。
  • 如果要删除第一个文档,请使用 first() 而不是 get()。
  • 使用 dd($post) 进行调试。它的 null 表示未找到具有提到的 id 和 user_id 的文档。然后你需要检查你的参数。现在为 id 和 user_id 传递静态参数并首先检查。如果有效则表示删除功能有效,然后您可以检查传递的参数
【解决方案3】:

使用 ->first() 代替 ->get()

您不能使用 delete()

删除整个集合

【讨论】:

    【解决方案4】:

    get换成first,之后检查帖子是否属于用户。

    public function destroy($id)
    {
        $post = Post::where('id', $id)->first();
        if($post && $post->user_id == \Auth::user()->id){
             $post->delete();
             return view('/home');
        }else{
            abort(404);
        }
    }
    

    【讨论】:

    • 得到错误 :: 在 null 上调用成员函数 delete()
    • 刚刚更新了我的代码,取回帖子后可以验证用户
    • 代码看起来正确,请确保您没有重试已在先前测试中删除的帖子。
    • 试图获取非对象的属性是我现在得到的
    • 您确定要删除的帖子确实存在于数据库中吗?
    【解决方案5】:

    控制器:

    public function destroy($id)
        {
            $post = Post::find($id);
            $post->delete();
            //redirect to
            return redirect()->back();
        }
    

    查看:

    {!! Form::open(['method' => 'DELETE','route' => ['posts.destroy', $post->id],'style'=>'display:inline']) !!}
    {!! Form::submit('Delete', ['class' => 'btn btn-danger']) !!}
    {!! Form::close() !!}
    

    试试这个。

    希望您使用

    创建控制器

    --资源

    标志。

    【讨论】:

      【解决方案6】:

      由于 post id 是 posts 表的主键,您可以直接从表中删除,
      不需要user_id

      要从您应该使用的 Auth 外观中获取 user_id,

      $user_id = Auth::id();
      

      只有通过 id 才能工作,

      Post::find($id)->delete()
      

      但是,如果您知道模型的主键,您可以通过调用destroy 方法删除模型而不检索它。除了单个主键作为其参数之外,destroy 方法还将接受多个主键、主键数组或主键 collection

      Post::destroy($id)
      

      【讨论】:

        【解决方案7】:

        请试试这个:

        public function destroy($id)
        {
            $userId = Auth::user()->id;
            $post = Post::where([
                            'id' => $id,
                            'user_id' => $userId
        
                    ])->delete();
        
            Session::flash('success', 'Post was successfully deleted!');
            return redirect()->route('posts.index');
        }
        

        【讨论】:

          【解决方案8】:

          这就是我能够删除表中的一个(或多个)关联记录的方式:

          RFIResponseFile::where('rfi_response_id',$response_id)->delete();
          

          【讨论】:

            【解决方案9】:

            在你的控制器中

            更改代码之前

            public function destroy($id)
            {
                $user_id = Auth::user();
                $post= Post::where('id', $id)->where('user_id',$user_id)->get();
                $post->delete();
            
                return view('/home', [
                    'posts' => $post
                ]);
            }
            

            修改代码后

                public function destroy($id)
                {
                    $user_id = Auth::user();
                    $post= Post::where(['id'=>$id,'user_id'=>$user_id])->get();
                           Post::where(['id'=>$id,'user_id'=>$user_id])->delete();
            
                    return view('/home', [
                        'posts' => $post
                    ]);
                }
            

            【讨论】:

              【解决方案10】:

              只需将其添加到视图顶部,我也遇到了像你一样的错误,现在解决了,抱歉英语不好。

               {!! Form::model($post, ['route' => ['posts.destroy', $post->id], 'method' => 'DELETE']) !!}
              

              {!! Form::close() !!} 
              

              在底部

              用于控制器

              $post = Post::find($id);
              $post->delete();
              
              Session::flash('success', 'Menu was successfully deleted!');
              return redirect()->route('posts.index');
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-12-22
                • 2018-09-18
                • 2021-12-03
                • 2019-09-10
                • 1970-01-01
                • 2016-11-22
                • 2018-01-25
                • 1970-01-01
                相关资源
                最近更新 更多