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?
使用查詢字符串的 GET
請(qǐng)求可以接受多個(gè)參數(shù)。而不是 ?tag=test&unit
(無(wú)論如何都不會(huì)真正起作用,因?yàn)?&unit
將被解析為 $request->input('unit')
,并且將是 null
,&
是保留字符),您可以發(fā)送為:
http://127.0.0.1:8000/posts?tags[]=test&tags[]=unit
在后端,當(dāng)你訪問(wèn) request()->input('tags')
時(shí),你會(huì)得到以下數(shù)組:
$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()
處理多個(gè)值request()->input('tags', [])
訪問(wèn) ?tags[]=...&tags[]=...
,如果未提供則為空數(shù)組。