Durchsuchen Sie Beiträge nach Tags
P粉323050780
P粉323050780 2024-04-03 22:38:54
0
1
643

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粉323050780
P粉323050780

Antworte allen(1)
P粉596161915

使用查询字符串的 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[]=...,如果未提供则为空数组。
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage