suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Durchsuchen Sie Beiträge nach Tags

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粉323050780P粉323050780224 Tage vor635

Antworte allen(1)Ich werde antworten

  • P粉596161915

    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[]=...,如果未提供则为空数组。

    Antwort
    0
  • StornierenAntwort