Maison > cadre php > Laravel > le corps du texte

Explication détaillée de la façon d'implémenter les fonctions de requête et de pagination multi-tables dans Laravel

PHPz
Libérer: 2023-04-03 19:08:53
original
1963 Les gens l'ont consulté

À mesure que le développement Web devient de plus en plus complexe, les requêtes de données sur une seule table ne peuvent pas répondre aux besoins réels. Par conséquent, dans le processus de développement actuel, les requêtes multi-tables sont progressivement devenues un élément indispensable. Dans Laravel, les requêtes multi-tables peuvent être simplifiées avec une simplicité que l'on ne trouve pas dans d'autres ORM.

Dans Laravel, les requêtes multi-tables peuvent utiliser certaines méthodes de modèle associées. Ces méthodes sont simples et faciles à utiliser, et peuvent rapidement nous permettre d'effectuer des requêtes multi-tables. Cet article présentera les fonctions de requête multi-tables et de pagination dans Laravel.

Requêtes de tables multiples

Des requêtes de tables multiples dans Laravel peuvent être implémentées en utilisant certaines méthodes de modèle d'association fournies par Eloquent ORM. Ces méthodes nous permettent de joindre plusieurs tables de la base de données et d'effectuer des requêtes conjointes.

Connexion individuelle

La connexion individuelle est le type de base de données relationnelle le plus simple. Dans Laravel, vous pouvez joindre deux tables en utilisant les méthodes hasOne et appartientTo.

Supposons que nous ayons une table d'utilisateurs et une table d'adresses, chaque utilisateur a une adresse. Dans ce cas, nous pouvons utiliser le code suivant pour accéder à l'adresse de l'utilisateur :

// 定义 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; // 返回用户的地址信息
Copier après la connexion

Nous pouvons également inverser la requête :

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

Connexion un-à-plusieurs

Un autre type de connexion courant est une connexion un-à-plusieurs. Dans ce cas, un modèle peut avoir plusieurs modèles associés. Par exemple, dans une application de blog, un utilisateur peut publier plusieurs publications. Nous pouvons utiliser les méthodes hasMany et appartientTo pour réaliser ce type de connexion.

// 定义 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; // 返回用户的所有文章
Copier après la connexion

Nous pouvons également ajouter d'autres conditions de requête dans le modèle Post :

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

Connexion plusieurs-à-plusieurs

La connexion plusieurs-à-plusieurs connecte deux modèles, et chaque modèle peut avoir plusieurs modèles associés. Par exemple, un article de blog peut avoir plusieurs balises et une balise peut être utilisée dans plusieurs articles. Dans Laravel, vous pouvez joindre deux tables en utilisant la méthode AppartientToMany.

// 定义 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; // 返回文章的所有标签
Copier après la connexion

Nous pouvons également ajouter d'autres conditions de requête au modèle Tag :

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

Fonction de pagination

Laravel fournit également une fonction de pagination qui nous permet de paginer les résultats de la requête. Nous pouvons utiliser la méthode paginate pour implémenter la fonction de pagination. La méthode paginate renverra une instance de paginateur, qui contient les données de la page actuelle, les liens de pagination et d'autres informations.

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

Nous pouvons également utiliser les liens de fonction auxiliaires pour obtenir des liens de pagination :

{!! $posts->links() !!}
Copier après la connexion

Cela affichera un paginateur sur la page, et nous pourrons cliquer sur le numéro de page pour passer à différentes pages.

Requête et pagination multi-tables

Dans le processus de développement réel, nous devons souvent effectuer des requêtes conjointes sur plusieurs tables et effectuer une pagination selon des conditions spécifiques. Dans Laravel, nous pouvons utiliser les étapes suivantes pour implémenter la fonction de pagination de requêtes multi-tables :

  1. Définir les modèles associés et leurs méthodes.
  2. Écrivez le code de requête et utilisez la méthode join pour joindre plusieurs tables. join 方法连接多张表。
  3. 使用 select 方法来选择查询的数据。
  4. 使用 orderBy 方法对查询结果进行排序。
  5. 使用 paginate 方法对查询结果进行分页。

例如,我们有一个文章管理系统,其中包含了三张表:postscategoriestags。以下是相关的模型定义:

// 定义 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);
    }
}
Copier après la connexion

我们需要查询所有已发布的文章,并按照发布时间从新到旧进行排序。查询结果应该包含文章的标题、作者、发布时间、分类和标签等信息。我们可以使用以下代码来实现:

$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);
Copier après la connexion

在上面的代码中,我们使用了 join 方法连接了 postscategoriestags 三个表。使用 where 方法指定了查询的条件(已发布的文章)。使用 select 方法选择了需要查询的字段,并且使用了 GROUP_CONCAT 函数来将同一篇文章的多个标签合并成一个字符串。

在最后,我们使用 paginate 方法进行分页,并且在视图文件中使用 links

Utilisez la méthode select pour sélectionner les données de la requête.

Utilisez la méthode orderBy pour trier les résultats de la requête. 🎜🎜Utilisez la méthode paginate pour paginer les résultats de la requête. 🎜🎜Par exemple, nous avons un système de gestion d'articles, qui contient trois tableaux : posts, catégories et tags. Voici la définition du modèle pertinent : 🎜
<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>
Copier après la connexion
🎜 Nous devons interroger tous les articles publiés et les trier du plus récent au plus ancien par heure de publication. Les résultats de la requête doivent inclure des informations telles que le titre de l'article, l'auteur, l'heure de publication, la classification et les balises. Nous pouvons utiliser le code suivant pour y parvenir : 🎜rrreee🎜Dans le code ci-dessus, nous utilisons la méthode join pour rejoindre les posts, les catégories et tags Trois tableaux. Les critères de requête (articles publiés) sont spécifiés à l'aide de la méthode where. Utilisez la méthode select pour sélectionner les champs qui doivent être interrogés et utilisez la fonction GROUP_CONCAT pour fusionner plusieurs balises du même article dans une chaîne. 🎜🎜À la fin, nous utilisons la méthode paginate pour la pagination, et la méthode links dans le fichier de vue pour restituer le paginateur. Code de pagination complet : 🎜rrreee🎜 Résumé : Dans Laravel, les requêtes multi-tables peuvent être implémentées à l'aide de la méthode de modèle associée, et la fonction de pagination peut être implémentée à l'aide de la méthode paginate. Grâce à ces fonctions, nous pouvons effectuer plus facilement des requêtes et des traitements de données complexes. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal