Cari siaran mengikut tag
P粉323050780
P粉323050780 2024-04-03 22:38:54
0
1
435

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

membalas semua(1)
P粉596161915

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()
  ]);
}
  • Laraskan pertanyaan untuk mengendalikan berbilang nilai menggunakan whereIn()
  • Menggunakan request()->input('tags', []) 访问 ?tags[]=...&tags[]=..., atau tatasusunan kosong jika tidak disediakan.
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!