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?
Gunakan rentetan pertanyaan ( GET
請求可以接受多個(gè)參數(shù)。而不是 ?tag=test&unit
(無論如何都不會(huì)真正起作用,因?yàn)?&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.