【发布时间】:2021-06-15 22:40:36
【问题描述】:
我想显示经过验证的普通用户,而不是过时且未禁止的用户:
a) 所有歌曲 b) 按标题或文字排列的歌曲 c ) 标签的歌曲
两个补充:
作为管理员的用户可以看到未经验证、被禁止和过时的歌曲,而作为艺术家的用户也可以看到未经验证或被禁止的歌曲,但只能看到他自己的歌曲。
已经累了好几天了,'在哪里,在哪里,在循环......'是折磨xD
您能帮我解决 scopeByUser 功能吗?
歌曲型号:
class Song extends Model
{
use HasFactory, Likable;
public function artist()
{
return $this->belongsTo(Artist::class, 'artist_id');
}
public function tags()
{
return $this->belongsToMany(Tag::class)->withTimestamps();
}
public function scopeByUser()
{
$user = current_user();
if ($user->hasRole('admin')) {
dd("x");
return $this;
} elseif (isset($user->artist)) {
return $this->where([
'isVerified' => true,
'isOutOfDate' => false,
'isBanned' => false
])->orWhere(function () use ($user) {
foreach ($user->artist as $artist) {
$this->where([
'artist_id', $artist->id,
'isOutOfDate' => false,
'isBanned' => false
]);
}
});
} else
return $this->where([
'isVerified' => true,
'isOutOfDate' => false,
'isBanned' => false
]);
}
}
歌曲控制器:
public function index(Request $request)
{
if (request('tag')) {
$songs = Song::query()
->whereHas('tags', function ($query) {
$tag = request('tag');
$query->where('name', $tag);
})
->ByUser()
->withLikes()
->get();
} elseif ($request) {
$search = $request->input('search');
$songs = Song::query()
->where('title', 'LIKE', "%{$search}%")->orWhere('text', 'LIKE', "%{$search}%")
->ByUser()
->withLikes()
->get();
} else {
$songs = Song::latest()
->ByUser()
->withLikes()
->get();
}
return view('welcome', compact('songs'));
}
【问题讨论】:
标签: php laravel foreach scope where-clause