Maison >cadre php >YII >Relations de modèle dans le framework Yii : implémentation de l'association de données

Relations de modèle dans le framework Yii : implémentation de l'association de données

WBOY
WBOYoriginal
2023-06-21 10:10:461326parcourir

Dans le framework Yii, la relation de modèle est un concept très important, utilisé pour réaliser une association de données entre plusieurs tables de données. En définissant des relations d'association, des données associées peuvent être obtenues directement lors de l'interrogation de données, ce qui réduit considérablement la complexité de l'interrogation et améliore l'efficacité de l'interrogation de données. Cet article présentera en détail les relations du modèle dans le framework Yii, notamment comment définir des relations, différents types de relations et comment utiliser les relations pour interroger des données.

1. Définissez la relation d'association

Dans le framework Yii, vous pouvez réaliser une association de données entre des tables de données en définissant la relation d'association dans la classe modèle. Plus précisément, une ou plusieurs méthodes publiques sont définies dans la classe model. Ces méthodes décrivent l'association entre la table de données et d'autres tables de données en appelant une série de méthodes d'association fournies par le framework Yii. Voici un exemple simple :

class Order extends ActiveRecord
{
    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
    }
}

Dans l'exemple ci-dessus, nous avons défini une méthode d'association getCustomer() pour décrire l'association entre la table de commande (Commande) et la relation table client (Client). Plus précisément, nous avons utilisé la méthode hasOne fournie par le framework Yii, qui représente une relation unidirectionnelle, c'est-à-dire qu'il n'y a qu'un seul client pour une commande. Parmi eux, le premier paramètre spécifie le nom de la classe de modèle associée et le deuxième paramètre spécifie la relation correspondante entre la clé étrangère associée et la clé primaire. Dans cet exemple, le champ customer_id de la table des commandes correspond au champ id de la table des clients.

2. Différents types d'associations

En plus de la méthode hasOne, le framework Yii fournit également plusieurs autres types d'associations pour mettre en œuvre différentes méthodes d'association de données. Voici plusieurs types couramment utilisés :

  1. Association un-à-plusieurs (hasMany)

L'association un-à-plusieurs signifie qu'un La classe modèle est associée à plusieurs classes modèle du même type. Dans la méthode d'association, il peut être défini à l'aide de la méthode hasMany.

class Order extends ActiveRecord
{
    public function getOrderItems()
    {
        return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
    }
}

Dans le code ci-dessus, nous spécifions l'association entre plusieurs classes de modèle OrderItem dans une classe de modèle Order, qui est implémentée via la méthode hasMany. Parmi eux, le premier paramètre spécifie le nom de la classe de modèle associée et le deuxième paramètre spécifie la relation correspondante entre la clé étrangère associée et la clé primaire. Dans cet exemple, le champ id de la table des commandes correspond au champ order_id de la table des éléments de commande.

  1. Il existe des associations un-à-plusieurs avec plusieurs associations (hasMany via)

Ce type d'association représente l'existence entre deux classes modèles Table d'association intermédiaire, et chaque classe de modèle possède plusieurs enregistrements associés à la table d'association intermédiaire. Dans la méthode d'association, il peut être défini à l'aide de la méthode hasMany.

class Order extends ActiveRecord
{
    public function getOrderItems()
    {
        return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
    }

    public function getProducts()
    {
        return $this->hasMany(Product::className(), ['id' => 'product_id'])
            ->via('orderItems');
    }
}

Dans le code ci-dessus, nous spécifions la relation entre plusieurs classes de modèle Product dans une classe de modèle Order, qui est implémentée via la méthode hasMany. Parmi eux, le premier paramètre spécifie le nom de la classe de modèle associée et le deuxième paramètre spécifie la relation correspondante entre la clé étrangère associée et la clé primaire. En appelant la méthode via('orderItems'), nous précisons que la table d'association intermédiaire OrderItem doit être utilisée dans l'association, au lieu d'utiliser directement l'association entre la table de commande (Order) et la table de produits (Product).

  1. Association individuelle (hasOne)

L'association individuelle signifie qu'il existe une association unidirectionnelle -une association entre deux relations de classes modèles. Dans la méthode d'association, il peut être défini à l'aide de la méthode hasOne.

class Order extends ActiveRecord
{
    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
    }
}

Dans le code ci-dessus, nous spécifions la relation d'association entre une classe de modèle Order et une classe de modèle Customer, qui est implémentée via la méthode hasOne. Parmi eux, le premier paramètre spécifie le nom de la classe de modèle associée et le deuxième paramètre spécifie la relation correspondante entre la clé étrangère associée et la clé primaire.

  1. Association plusieurs-à-plusieurs (hasMany)

Une association plusieurs-à-plusieurs indique qu'il existe un plusieurs-à-plusieurs bidirectionnel association entre deux classes modèles . Dans la méthode d'association, il peut être défini à l'aide de la méthode hasMany.

class Order extends ActiveRecord
{
    public function getProducts()
    {
        return $this->hasMany(Product::className(), ['id' => 'product_id'])
            ->viaTable('order_item', ['order_id' => 'id']);
    }
}

Dans le code ci-dessus, nous spécifions la relation entre plusieurs classes de modèle Product dans une classe de modèle Order, qui est implémentée via la méthode hasMany. Parmi eux, le premier paramètre spécifie le nom de la classe de modèle associée et le deuxième paramètre spécifie la relation correspondante entre la clé étrangère associée et la clé primaire. En appelant la méthode viaTable('order_item', ['order_id' => 'id']), on précise que la table d'association intermédiaire order_item doit être utilisée dans l'association.

3. Interroger des données à l'aide d'associations

En définissant des associations, nous pouvons utiliser la méthode ActiveRecord fournie par le framework Yii pour compléter la requête de données correspondante. Voici un exemple simple :

$order = Order::findOne(1);
$customer = $order->customer;

Dans le code ci-dessus, nous utilisons d'abord la méthode findOne pour interroger l'enregistrement de commande avec l'identifiant 1, puis obtenons les informations client correspondant à la commande via la méthode d'association. .

En plus d'accéder directement à la méthode associée, nous pouvons également utiliser la méthode with pour précharger les données associées, réduisant ainsi le besoin d'interroger la base de données plusieurs fois.

$orders = Order::find()->with('customer')->all();
foreach ($orders as $order) {
    echo $order->customer->name;
}

Dans le code ci-dessus, nous utilisons d'abord la méthode find pour interroger tous les enregistrements de commande et préchargeons les informations client associées à la commande en appelant la méthode with('customer'). De cette façon, dans la boucle foreach suivante, chaque fois que l'on accède aux informations client de la commande, elles peuvent être obtenues directement à partir de la mémoire sans interroger à nouveau la base de données.

résumé

Cet article présente principalement les relations du modèle dans le framework Yii, notamment comment définir des relations, différents types de relations et comment utiliser des relations pour interroger des données. En utilisant rationnellement les relations de modèle, nous pouvons considérablement améliorer l'efficacité des requêtes de données et rendre le code du programme plus concis et plus lisible.

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!

Déclaration:
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