Maison > Questions et réponses > le corps du texte
Je dois afficher les publications par balises. Ma solution fonctionne pour une seule étiquette comme ceci :
Itinéraire :
Route::get('/posts', [PostController::class, 'index'])->middleware('auth');
Filtre post-modèle :
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); }); } }
Indice de la méthode PostController :
public function index() { return view('posts', [ 'posts' => Post::latest()->filter(request(['tag']))->get() ]); }
Ce code s'applique à l'URL suivante : "http://127.0.0.1:8000/posts/?tag=test". Mais je dois trouver un moyen de rechercher des publications avec plus de balises, par exemple, je souhaite trouver des publications avec les balises « test » et « unité ». Pour ce faire, je souhaite utiliser une URL comme celle-ci : "http://127.0.0.1:8000/posts/?tag=test&unit". Je suis bloqué parce que je pensais que "request(['tag'])" renverrait "test&unit" mais il ne renvoie que "test". Est-il possible d'obtenir d'une manière ou d'une autre la balise « unité » à partir de cette requête ?
P粉5961619152024-04-04 18:26:32
Utilisez la chaîne de requête ( GET
请求可以接受多个参数。而不是 ?tag=test&unit
(无论如何都不会真正起作用,因为 &unit
将被解析为 $request->input('unit')
,并且将是 null
,&
est un caractère réservé), vous pouvez l'envoyer comme :
http://127.0.0.1:8000/posts?tags[]=test&tags[]=unit
Dans le backend, lorsque vous accédez à request()->input('tags')
, vous obtenez le tableau suivant :
$tags = request()->input('tags'); // ['test', 'unit']
Alors, en les assemblant :
// 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[]=...
, ou un tableau vide s'il n'est pas fourni.