Heim > Fragen und Antworten > Hauptteil
Ich muss Beiträge nach Tags anzeigen. Meine Lösung funktioniert für ein einzelnes Etikett wie folgt:
Route:
Route::get('/posts', [PostController::class, 'index'])->middleware('auth');
Post-Model-Filter:
public function scopeFilter($query, array $filters) { if ($filters['tag'] ?? false) { $tagId = Tag::where('name', $filters['tag'])->first()->id; $query->whereHas('tags', function($q) use ($tagId) { $q->where('tag_id', $tagId); }); } }
PostController-Methodenindex:
public function index() { return view('posts', [ 'posts' => Post::latest()->filter(request(['tag']))->get() ]); }
Dieser Code gilt für die folgende URL: „http://127.0.0.1:8000/posts/?tag=test“. Aber ich muss eine Möglichkeit finden, nach Beiträgen mit mehr Tags zu suchen, ich möchte beispielsweise Beiträge mit den Tags „test“ und „unit“ finden. Dazu möchte ich eine URL wie diese verwenden: „http://127.0.0.1:8000/posts/?tag=test&unit“. Ich stecke fest, weil ich dachte, „request(['tag'])“ würde „test&unit“ zurückgeben, aber es gibt nur „test“ zurück. Ist es irgendwie möglich, das Tag „unit“ aus dieser Anfrage zu erhalten?
P粉5961619152024-04-04 18:26:32
使用查询字符串的 GET
请求可以接受多个参数。而不是 ?tag=test&unit
(无论如何都不会真正起作用,因为 &unit
将被解析为 $request->input('unit')
,并且将是 null
,&
是保留字符),您可以发送为:
http://127.0.0.1:8000/posts?tags[]=test&tags[]=unit
在后端,当你访问 request()->input('tags')
时,你会得到以下数组:
$tags = request()->input('tags'); // ['test', 'unit']
所以,把它们放在一起:
// ScopeFilter method on your `Post` Model
public function scopeFilter($query, array $tagNames) {
if (!empty($tagNames)) {
$tagIds = Tag::whereIn('name', $tagNames)->pluck('id');
return $query->whereHas('tags', function($subQuery) use ($tagIds) {
return $subQuery->whereIn('tags.id', $tagIds);
});
// Alternative without `$tagIds`, using `$tagNames` directly
// return $query->whereHas('tags', function($subQuery) use ($tagNames) {
// return $subQuery->whereIn('tags.name', $tagNames);
// });
}
return $query;
}
// Usage
public function index() {
return view('posts', [
'posts' => Post::latest()->filter(request()->input('tags', []))->get()
]);
}
whereIn()
处理多个值request()->input('tags', [])
访问 ?tags[]=...&tags[]=...
,如果未提供则为空数组。