在 laravel 中过滤搜索结果
Filtering search results in laravel
一个用户可以订阅一个包,这个包可以有很多视频。
除非用户订阅包,否则所有付费视频都不可见。
请注意:无需订阅即可观看免费视频。
我的问题是,当我想应用搜索查询时,用户可以查看所有视频,我不希望这样,我希望用户只查看他订阅的视频。
这是我的代码行:
VideoController.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'));
}
video/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);
}
因此,您必须添加另一个子句来检查当前用户的订阅情况,而不是只检查关键字。
$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()->id()
) 相同。
一个用户可以订阅一个包,这个包可以有很多视频。
除非用户订阅包,否则所有付费视频都不可见。
请注意:无需订阅即可观看免费视频。
我的问题是,当我想应用搜索查询时,用户可以查看所有视频,我不希望这样,我希望用户只查看他订阅的视频。
这是我的代码行:
VideoController.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'));
}
video/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);
}
因此,您必须添加另一个子句来检查当前用户的订阅情况,而不是只检查关键字。
$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()->id()
) 相同。