Rumah  >  Artikel  >  rangka kerja php  >  Penjelasan terperinci tentang cara melaksanakan pertanyaan berbilang jadual dan fungsi halaman dalam Laravel

Penjelasan terperinci tentang cara melaksanakan pertanyaan berbilang jadual dan fungsi halaman dalam Laravel

PHPz
PHPzasal
2023-04-03 18:52:281897semak imbas

Apabila pembangunan web menjadi semakin kompleks, pertanyaan data jadual tunggal tidak dapat memenuhi keperluan sebenar. Oleh itu, dalam proses pembangunan sebenar, pertanyaan berbilang jadual secara beransur-ansur menjadi bahagian yang sangat diperlukan. Dalam Laravel, pertanyaan berbilang jadual boleh dipermudahkan dengan kesederhanaan yang tidak terdapat dalam ORM lain.

Dalam Laravel, pertanyaan berbilang jadual boleh menggunakan beberapa kaedah model yang berkaitan. Kaedah ini mudah dan mudah digunakan, dan dengan cepat boleh membolehkan kami melakukan pertanyaan berbilang jadual. Artikel ini akan memperkenalkan pertanyaan berbilang jadual dan fungsi halaman dalam Laravel.

Pertanyaan berbilang jadual

Pertanyaan berbilang jadual dalam Laravel boleh dilaksanakan dengan menggunakan beberapa kaedah model hubungan yang disediakan oleh Eloquent ORM. Kaedah ini membolehkan kami menyertai berbilang jadual dalam pangkalan data dan melakukan pertanyaan bersama.

Sambungan satu dengan satu

Sambungan satu dengan satu ialah jenis pangkalan data hubungan yang paling mudah. Dalam Laravel, anda boleh menyertai dua jadual dengan menggunakan kaedah hasOne dan belongsTo.

Andaikan kita mempunyai jadual pengguna dan jadual alamat, dan setiap pengguna mempunyai alamat. Dalam kes ini, kami boleh menggunakan kod berikut untuk mengakses alamat pengguna:

// 定义 User 模型
class User extends Model
{
    public function address()
    {
        return $this->hasOne(Address::class);
    }
}

// 定义 Address 模型
class Address extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

// 查询
$user = User::find(1);
$address = $user->address; // 返回用户的地址信息

Kami juga boleh membalikkan pertanyaan:

$address = Address::find(1);
$user = $address->user; // 返回地址所属的用户信息

Satu-ke-banyak sertai

Satu lagi jenis sambungan biasa ialah sambungan satu-ke-banyak. Dalam kes ini, model boleh mempunyai berbilang model berkaitan. Sebagai contoh, dalam aplikasi blog, pengguna boleh mempunyai berbilang siaran. Kita boleh menggunakan kaedah hasMany dan belongsTo untuk mencapai jenis sambungan ini.

// 定义 User 模型
class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

// 定义 Post 模型
class Post extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

// 查询
$user = User::find(1);
$posts = $user->posts; // 返回用户的所有文章

Kami juga boleh menambah syarat pertanyaan lain dalam model Post:

$user = User::find(1);
$posts = $user->posts()->where('published', 1)->get(); // 返回已发布的文章

Sambungan banyak-ke-banyak

Sambungan banyak-ke-banyak menghubungkan dua model , setiap model boleh mempunyai berbilang model yang berkaitan dengannya. Sebagai contoh, catatan blog boleh mempunyai berbilang teg dan teg boleh digunakan dalam berbilang catatan. Dalam Laravel, anda boleh menyertai dua jadual dengan menggunakan kaedah belongsToMany.

// 定义 Post 模型
class Post extends Model
{
    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }
}

// 定义 Tag 模型
class Tag extends Model
{
    public function posts()
    {
        return $this->belongsToMany(Post::class);
    }
}

// 查询
$post = Post::find(1);
$tags = $post->tags; // 返回文章的所有标签

Kami juga boleh menambah syarat pertanyaan lain dalam model Tag:

$tag = Tag::find(1);
$posts = $tag->posts()->where('published', 1)->get(); // 返回该标签下已发布的文章

Fungsi paging

Laravel juga menyediakan fungsi paging yang membolehkan kami membuat pertanyaan hasil adalah penomboran. Kita boleh menggunakan kaedah penomboran untuk melaksanakan fungsi paging Kaedah penomboran akan mengembalikan contoh penomboran, yang mengandungi data halaman semasa, pautan halaman dan maklumat lain.

$posts = Post::paginate(10); // 查询所有文章,每页显示 10 条数据

Kami juga boleh menggunakan pautan fungsi tambahan untuk mendapatkan pautan penomboran:

{!! $posts->links() !!}

Ini akan memaparkan penombor pada halaman dan kami boleh mengklik pada nombor halaman untuk menukar ke halaman yang berbeza.

Paging pertanyaan berbilang jadual

Dalam proses pembangunan sebenar, kita selalunya perlu melakukan pertanyaan bersama pada berbilang jadual dan melakukan paging mengikut syarat tertentu. Dalam Laravel, kita boleh menggunakan langkah berikut untuk melaksanakan fungsi halaman pertanyaan berbilang jadual:

  1. Tentukan model berkaitan dan kaedahnya.
  2. Tulis kod pertanyaan dan gunakan kaedah join untuk menyambungkan berbilang jadual.
  3. Gunakan kaedah select untuk memilih data untuk pertanyaan.
  4. Gunakan kaedah orderBy untuk mengisih hasil pertanyaan.
  5. Gunakan kaedah paginate untuk menomborkan hasil pertanyaan.

Sebagai contoh, kami mempunyai sistem pengurusan artikel yang mengandungi tiga jadual: posts, categories dan tags. Berikut ialah definisi model yang berkaitan:

// 定义 Post 模型
class Post extends Model
{
    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }
}

// 定义 Category 模型
class Category extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

// 定义 Tag 模型
class Tag extends Model
{
    public function posts()
    {
        return $this->belongsToMany(Post::class);
    }
}

Kita perlu menanyakan semua artikel yang diterbitkan dan menyusunnya daripada yang terbaru kepada yang lama mengikut masa penerbitan. Hasil pertanyaan hendaklah termasuk maklumat seperti tajuk artikel, pengarang, masa penerbitan, klasifikasi dan teg. Kita boleh menggunakan kod berikut untuk mencapai ini:

$posts = Post::join('categories', 'posts.category_id', '=', 'categories.id')
    ->join('post_tag', 'posts.id', '=', 'post_tag.post_id')
    ->join('tags', 'tags.id', '=', 'post_tag.tag_id')
    ->where('posts.published', true)
    ->select(
        'posts.title', 
        'posts.author',
        'posts.published_at',
        'categories.name as category',
        DB::raw('GROUP_CONCAT(tags.name) as tags')
    )
    ->orderBy('published_at', 'desc')
    ->groupBy('posts.id')
    ->paginate(10);

Dalam kod di atas, kami menggunakan kaedah join untuk menyertai tiga jadual posts, categories dan tags. Gunakan kaedah where untuk menentukan syarat pertanyaan (artikel yang diterbitkan). Gunakan kaedah select untuk memilih medan yang perlu ditanya dan gunakan fungsi GROUP_CONCAT untuk menggabungkan berbilang teg artikel yang sama menjadi satu rentetan.

Pada akhirnya, kami menggunakan kaedah paginate untuk penomboran dan kaedah links dalam fail paparan untuk memaparkan penomboran. Kod penomboran lengkap:

<div class="container">
    <div class="row">
        @foreach ($posts as $post)
        <div class="col-md-8">
            <h3>{{ $post->title }}</h3>
            <p class="text-muted">{{ $post->published_at->diffForHumans() }} | {{$post->category}} | Tags: {{ $post->tags }}</p>
            <p>{{ Str::limit($post->content, 200) }}</p>
            <hr>
        </div>
        @endforeach
    </div>
    {{ $posts->links() }}
</div>

Ringkasan: Dalam Laravel, pertanyaan berbilang jadual boleh dilaksanakan menggunakan kaedah model yang berkaitan dan fungsi halaman boleh dilaksanakan menggunakan kaedah penomboran. Menggunakan fungsi ini, kami boleh melakukan pertanyaan dan pemprosesan data yang kompleks dengan lebih mudah.

Atas ialah kandungan terperinci Penjelasan terperinci tentang cara melaksanakan pertanyaan berbilang jadual dan fungsi halaman dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn