在 laravel 中过滤搜索结果

Posted

技术标签:

【中文标题】在 laravel 中过滤搜索结果【英文标题】:Filtering search results in laravel 【发布时间】:2021-05-14 00:21:14 【问题描述】:

一个用户可以订阅一个包,这个包可以有很多视频。

除非用户订阅套餐,否则所有付费视频均不可见。

请注意:免费视频无需订阅即可观看。

我的问题是,当我想应用搜索查询时,用户可以查看所有我不想要的视频,我希望用户只查看他订阅的视频。

这是我的代码行:

视频控制器.php

public function index(Request $request)

  $keyword = $request->get('search');
  $perPage = 10;

  if (!empty($keyword)) 
    $videos = Video::where('video_title', 'LIKE', "%$keyword%")
        ->orWhere('video_file', 'LIKE', "%$keyword%")
        ->latest()->paginate($perPage);
   else 
    $videos = Video::where('video_type', '=', 'Free')->latest()->paginate($perPage);
  

  return view('video.index', compact('videos'));

视频/index.blade.php

@foreach (auth()->user()->subscriptions as $subscription)
@foreach ($subscription->packages as $package)
    <h4>
         $package->package_name 
    </h4>
    @foreach ($package->videos as $video)
        <a href=" url('/video/' . $video->id) ">
             $video->video_title  (Click to view)
        </a>
    @endforeach
@endforeach
@endforeach
@foreach ($videos as $item)
<a href=" url('/video/' . $item->id) ">
     $item->video_title  (Click to view)
</a>
@endforeach
<div> !! $videos->appends(['search' => Request::get('search')])->render() !! </div>

Subscription.php 模型

  public function user()
  
    return $this->belongsTo(User::class);
  

  public function packages()
  
    return $this->hasMany(Package::class);
  

User.php 模型

public function subscriptions()

  return $this->hasMany(Subscription::class);

Package.php 模型

public function subscription()

    return $this->belongsTo(Subscription::class);

public function videos()

    return $this->belongsToMany(Video::class);

Video.php 模型

public function packages()

    return $this->belongsToMany(Package::class);

【问题讨论】:

如何判断用户是否订阅了视频? @AnuratChapanond 使用 Subscription.php 模型及其迁移 请也提供这些,但基本上您可以在查询中添加 ->whereHas('subscription') 以仅获取订阅的视频。 @AnuratChapanond 完成,请检查已编辑的问题 【参考方案1】:

因此,您必须添加另一个子句来检查当前用户的订阅,而不是只检查关键字。

$videos = Video::whereHas('packages.subscription', function($query) 
        $query->where('subscription.user_id', auth()->id());
    )
    ->where(function($query) use ($keyword) 
        $query->where('video_title', 'LIKE', "%$keyword%")
            ->orWhere('video_file', 'LIKE', "%$keyword%");
    )
    ->latest()
    ->paginate($perPage);

whereHas 会检查视频是否有订阅,订阅的 user_id 是否与当前用户 id (auth()-&gt;id()) 相同。

【讨论】:

我得到这个错误,“未定义的变量:关键字” 我将 use ($keyword) 添加到闭包中。 你做的功能只适用于付费视频,如果我想申请免费视频,可以吗? 当然,您可以为另一个查询编写相同的子句。 能否再输入一个免费视频?

以上是关于在 laravel 中过滤搜索结果的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:高级搜索表单查询

Vue JS 对分页 Laravel 结果的实时客户端搜索过滤器

Laravel 5.3 中的搜索栏来过滤表格

laravel 过滤器搜索名称 [空格] 姓氏一起失败,个人姓名或姓氏搜索有效

Laravel 过滤有很多结果

在页脚中使用过滤器进行列搜索 - 页脚过滤器未显示 - Laravel Datatables Yajrabox