laravel policy 的sql优化

在使用laravel做帖子回复的policy策略,只有回复的发表者或者帖子的发表者才显示删除按钮. 代码如下:
html页面部分

@foreach($replies as $reply)
    <li class="media" name="reply{{$reply->id}}"  id="reply{{ $reply->id }}">
       <div class="media-left">
           <a href="{{route('users.show',[$reply->user_id])}}">
               <img class="img-thumbnail mr-3" src="{{$reply->user->avatar}}" alt="" style="height: 50px;">
           </a>
       </div>
        <div class="media-body">
            <h5 class="mt-0"><a href="{{route('users.show',[$reply->user_id])}}">{{$reply->user->name}} </a>· {{$reply->created_at->diffForHumans()}}</h5>
            {{$reply->content}}
        </div>
        @can('destroy',$reply)
        <div>
            <form method="post" action="{{route('replies.destroy',$reply->id)}}">
                @csrf
                {{method_field('DELETE')}}
                <button type="submit" class="btn btn-outline-secondary btn-sm">删除</button>
            </form>
        </div>
        @endcan
    </li>
    <hr>
@endforeach

策略的定义ReplyPolicy.php

class ReplyPolicy extends Policy
{
    public function destroy(User $user, Reply $reply)
    {
        //第22行 第22行
        if($user->id===$reply->user_id ||$user->id===$reply->topic->user_id){
            return true;
        }
    }

现在的问题,从laravel debug工具的sql语句执行了好多次重复的sql

clipboard.png
针对这个问题,我该如何做优化了

阅读 2k
2 个回答
  @can('destroy',$reply)
        <div>
            <form method="post" action="{{route('replies.destroy',$reply->id)}}">
                @csrf
                {{method_field('DELETE')}}
                <button type="submit" class="btn btn-outline-secondary btn-sm">删除</button>
            </form>
        </div>
        @endcan

因为你这个是放foreach里面 的循环n次就查询c次,我觉得你这个记录 可以连表查询吧 如果不连表查询,自己做个方法根据id查询,但上缓存 就好了

会不会用到with解决N+1的问题,你查下资料

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进