在Laravel中更新和删除

在Laravel中更新和删除,laravel,authentication,crud,Laravel,Authentication,Crud,我希望用户只能执行诸如删除和更新自己的帖子(在本例中为评论)之类的操作 我有两个问题要解决: 来自不同用户的多条评论显示在同一页面上,我在每条评论旁边都有更新或删除的链接。我只希望链接出现在评论旁边,如果它是他们创建的评论 我已经有了创建、更新和删除工作的功能(尽管更新和删除目前没有考虑用户是谁)。我不知道我是否需要实施门户、政策或两者,以及这将如何影响我已经创造的东西。。。例如,我必须将控制器函数中的代码移动到策略中吗?我已经看过了拉威尔资源公司,这对我很有帮助,但我仍然不清楚 类具有定义的关

我希望用户只能执行诸如删除和更新自己的帖子(在本例中为评论)之类的操作

我有两个问题要解决:

  • 来自不同用户的多条评论显示在同一页面上,我在每条评论旁边都有更新或删除的链接。我只希望链接出现在评论旁边,如果它是他们创建的评论

  • 我已经有了创建、更新和删除工作的功能(尽管更新和删除目前没有考虑用户是谁)。我不知道我是否需要实施门户、政策或两者,以及这将如何影响我已经创造的东西。。。例如,我必须将控制器函数中的代码移动到策略中吗?我已经看过了拉威尔资源公司,这对我很有帮助,但我仍然不清楚

  • 类具有定义的关系,例如:

       class User extends Authenticatable
        {
        public function comments()
        {
            return $this->hasMany(Comment::class);
        }
    
    我有在控制器中执行操作的功能,例如:

    public function addComment(Request $request, $id)
    {
        $request->validate([
            'body' => 'required',
    
        ]);
    
        $entry = new Comment();
        $film = Film::find($id);
        $entry->body = $request->body;
        $entry->film_id = $film->id;
        $entry->user_id = auth()->user()->id;
        $entry->save();
    
        return redirect('/');
    }
    
    
    public function updateComment(Request $request)
    {
        $request->validate([
            'body' => 'required',
        ]);
    
        $entry = Comment::find($id);
        $entry->body = $request->body;
        $entry->save();
    }
    
    注释表:

    Schema::create('comments', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id');
        $table->integer('film_id');
        $table->string('body');
        $table->timestamps();
    
    评论:

    <h1>{{ $film->title }}</h1>
    
    <!--<p>{{$film->comments}}</p>-->
    <table id="myTable">
        <tr>
            <th>Comment</th>
            <th>User</th>
            @if (Auth::check())
            <th>Update</th>
            <th>Delete</th>
            @endif
    
    @foreach ($film->comments as $comment)
    
        <tr>
            <td>{{$comment->body}}</td>
            <td>{{$comment->user['name']}}</td>
    
            @if (Auth::check())
            <td><a href="/update/{{$comment->id}}">Update</a></td>
            <td><a href="/delete/{{$comment->id}}">Delete</a></td>
            @endif
        </tr>
        @endforeach
    </table>
    @if (Auth::check())
    <div>@include('form')</div>
    @else
    <h3>Please log in to add a comment</h3>
    @endif
    @endsection
    

    我目前正在使用
    @if(Auth::check())
    隐藏未登录的链接,但这不是解决我问题的合适方法。

    您可以将登录用户的用户id与当前注释的用户id进行比较,如
    可选(Auth::user())->id==$comment->user\u id

    注意这里的
    可选()。这将确保在没有用户登录的情况下,
    Auth::user()
    可以返回
    null
    。如果没有Laravel,将抛出一个错误,因为我们在
    null
    上调用
    ->id

    下面,我将此剪接添加到您的代码中:

    @foreach ($film->comments as $comment)
        <tr>
            <td>{{$comment->body}}</td>
            <td>{{$comment->user['name']}}</td>
    
            @if(optional(Auth::user())->id === $comment->user['id'])
            <td><a href="/update/{{$comment->id}}">Update</a></td>
            <td><a href="/delete/{{$comment->id}}">Delete</a></td>
            @endif
        </tr>
    @endforeach
    
    @foreach($film->comments as$comment)
    {{$comment->body}
    {{$comment->user['name']}
    @if(可选(Auth::user())->id===$comment->user['id'])
    @恩迪夫
    @endforeach
    
    如果您使用“已注册保单”,则可以使用“可以”和“不能”。can/铁路超高在刀片和用户身上都适用

    $user->can('create',Post::class)

    $user->can('update',$post_实例)

    @can('update',$post_实例) ... 等等


    请同时发布相关刀片代码。刚刚添加了bladeThank you@common sense。对这个答案做了一点小小的修改:
    @if(Auth::check()&&Auth::user()->id==$comment->user['id'])
    。同时,如果我排除了
    Auth::check
    ,只需执行
    @if(Auth::user()->id===$comment->user['id')
    ,这同样有效。是否仍需要有
    Auth::check
    ?另外,即使
    Auth::check
    仍然存在,我也可以更改url并修改其他人的评论。您可以删除第一个检查,并应使用
    optional()
    helper。见我的最新答案。谢谢你@常识。我现在唯一的问题是,我可以手动将url从say
    commentupdate/1
    更改为
    commentupdate/2
    ,这样就可以更新不属于我的评论。不确定这是否可以通过路线解决?我在帖子中添加了一个路线示例。我使用了
    ->中间件('auth')在必要的路径上,但是想知道是否有一种方法可以在这里声明特定的用户?更新-认为我需要中间件,我需要研究它,如果需要,将发布不同的问题。再次感谢@common sense。我看到了这一点,但正如我上面所说的,我不明白如何在现有代码中实现它。。。例如,我在控制器中有一个要保存的函数,一个要编辑,另一个要删除注释。在laravel.com上的策略文档中说,
    class PostPolicy{public function update(User$User,Post$Post){return$User->id===$Post->User_id;}
    这与我现有的更新函数有什么关系?
    @foreach ($film->comments as $comment)
        <tr>
            <td>{{$comment->body}}</td>
            <td>{{$comment->user['name']}}</td>
    
            @if(optional(Auth::user())->id === $comment->user['id'])
            <td><a href="/update/{{$comment->id}}">Update</a></td>
            <td><a href="/delete/{{$comment->id}}">Delete</a></td>
            @endif
        </tr>
    @endforeach