Maison  >  Questions et réponses  >  le corps du texte

Rechercher des articles par balises

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粉323050780P粉323050780179 Il y a quelques jours442

répondre à tous(1)je répondrai

  • P粉596161915

    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()
      ]);
    }
    
    • Ajustez la requête pour gérer plusieurs valeurs à l'aide de whereIn()
    • Utilise request()->input('tags', []) 访问 ?tags[]=...&tags[]=..., ou un tableau vide s'il n'est pas fourni.

    répondre
    0
  • Annulerrépondre