Rumah > Soal Jawab > teks badan
Saya perlu memaparkan siaran mengikut tag. Penyelesaian saya berfungsi untuk satu label seperti ini:
Laluan:
Route::get('/posts', [PostController::class, 'index'])->middleware('auth');
Penapis Model Pos:
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); }); } }
Indeks kaedah PostController:
public function index() { return view('posts', [ 'posts' => Post::latest()->filter(request(['tag']))->get() ]); }
Kod ini digunakan pada URL berikut: "http://127.0.0.1:8000/posts/?tag=test". Tetapi saya perlu mencari cara untuk mencari siaran dengan lebih banyak tag, contohnya saya ingin mencari siaran dengan tag "ujian" dan "unit". Untuk melakukan ini saya ingin menggunakan URL seperti ini: "http://127.0.0.1:8000/posts/?tag=test&unit". Saya tersekat kerana saya fikir "permintaan(['tag'])" akan mengembalikan "ujian&unit" tetapi ia hanya mengembalikan "ujian". Adakah mungkin untuk mendapatkan teg "unit" daripada permintaan ini?
P粉5961619152024-04-04 18:26:32
Gunakan rentetan pertanyaan ( GET
请求可以接受多个参数。而不是 ?tag=test&unit
(无论如何都不会真正起作用,因为 &unit
将被解析为 $request->input('unit')
,并且将是 null
,&
ialah aksara terpelihara), anda boleh menghantarnya sebagai:
http://127.0.0.1:8000/posts?tags[]=test&tags[]=unit
Di bahagian belakang, apabila anda mengakses request()->input('tags')
anda mendapat tatasusunan berikut:
$tags = request()->input('tags'); // ['test', 'unit']
Jadi, menggabungkannya:
// 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[]=...
, atau tatasusunan kosong jika tidak disediakan.