Analyse de la requête d'association de table Yii2.0

不言
Libérer: 2023-04-01 10:34:02
original
2599 Les gens l'ont consulté

Cet article présente principalement la méthode de requête d'association de table dans Yii2.0 et analyse la méthode de mise en œuvre et les compétences d'utilisation associées de la requête d'association dans Yii sous forme d'exemples. Les amis dans le besoin peuvent se référer à ce qui suit

<.>Les exemples de cet article sont expliqués. La méthode de requête d'association de table Yii2.0 est introduite. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Vous pouvez utiliser ActiveRecord pour effectuer des requêtes associées (par exemple, lors de la lecture des données de la table A, lisez ensemble les données de la table B associée), dans Active Record , l'obtention des données associées peut être aussi simple que d'accéder aux propriétés de l'objet ActiveRecord dans la table principale.

Par exemple, avec la déclaration de relation appropriée, vous pouvez utiliser $customer->orders pour obtenir un tableau d'objets Order représentant les commandes passées par ce client.

Pour déclarer une relation, définissez une méthode getter, qui renvoie un objet yiidbActiveQuery avec les informations de contexte associées, afin que seules les données pertinentes qui remplissent les conditions soient interrogées. Par exemple :

class Customer extends \yii\db\ActiveRecord
{
 public function getOrders()
 {
  // Customer has_many Order via Order.customer_id -> id
  return $this->hasMany(Order::className(), [&#39;customer_id&#39; => &#39;id&#39;]);
 }
}
class Order extends \yii\db\ActiveRecord
{
 // Order has_one Customer via Customer.id -> customer_id
 public function getCustomer()
 {
  return $this->hasOne(Customer::className(), [&#39;id&#39; => &#39;customer_id&#39;]);
 }
}
Copier après la connexion
Les yiidbActiveRecord::hasMany() et yiidbActiveRecord::hasOne() dans le code ci-dessus sont utilisés pour modéliser les relations un-à-plusieurs et un-à-un dans les bases de données relationnelles. Par exemple, un client a plusieurs commandes et une commande possède ou appartient à un utilisateur. Les deux méthodes reçoivent deux paramètres et renvoient un objet yiidbActiveQuery :

$class : Le nom de classe du modèle associé.

$link: Association de colonnes entre deux tables. Cela doit être un tableau. Les clés des éléments du tableau sont les noms de colonnes de la table correspondant à $class, et les valeurs des éléments du tableau sont les noms de colonnes de la classe actuellement déclarée. Il est recommandé de définir ces relations en termes d'associations de clés étrangères de table.

Après avoir terminé la déclaration ci-dessus, vous pouvez obtenir les données associées tout comme accéder aux propriétés de l'objet en définissant la méthode getter correspondante :

// get the orders of a customer
$customer = Customer::findOne(1);
$orders = $customer->orders; // $orders is an array of Order objects
Copier après la connexion
Le code ci-dessus exécute en fait les deux requêtes SQL suivantes derrière les scene. , correspondant respectivement aux deux lignes de code ci-dessus :

SELECT * FROM customer WHERE id=1;
SELECT * FROM order WHERE customer_id=1;
Copier après la connexion
Astuce : Si vous accédez à nouveau à $customer->orders, la requête SQL de la deuxième ligne ci-dessus ne sera pas exécutée de manière répétée. Cette instruction de requête n'est exécutée que lors du premier accès à l'expression. Les accès ultérieurs renverront directement les données internes mises en mémoire tampon. Si vous souhaitez réexécuter la requête, appelez simplement unset d'abord pour vider le cache :

unset($customer->orders);.
Copier après la connexion
Parfois, vous souhaiterez peut-être transmettre des paramètres à la requête associée pour limiter les conditions de la requête. Par exemple, vous souhaitez uniquement lire les commandes importantes dépassant un montant spécifié, pas toutes les commandes. À cette fin, vous pouvez utiliser la méthode getter suivante pour déclarer une relation bigOrders :

class Customer extends \yii\db\ActiveRecord
{
 public function getBigOrders($threshold = 100)
 {
  return $this->hasMany(Order::className(), [&#39;customer_id&#39; => &#39;id&#39;])
   ->where(&#39;subtotal > :threshold&#39;, [&#39;:threshold&#39; => $threshold])
   ->orderBy(&#39;id&#39;);
 }
}
Copier après la connexion

N'oubliez pas que hasMany() renvoie un objet qui est un yiidbActiveQuery, les méthodes ActiveQuery peuvent donc être utilisées pour personnaliser cette requête associée.

Avec l'instruction ci-dessus, si vous accédez à $customer->bigOrders, seules les commandes d'un montant supérieur à 100 seront renvoyées. Si vous souhaitez spécifier une valeur limite différente, utilisez le code suivant :

$orders = $customer->getBigOrders(200)->all();
Copier après la connexion

Remarque : La méthode associée renvoie une instance yiidbActiveQuery. Si vous y accédez en tant que propriété (propriété de classe), les données renvoyées sont une instance yiidbActiveRecord, un tableau ActiveRecord ou null. Par exemple, $customer->getOrders() renvoie une instance ActiveQuery, tandis que $customer->orders renvoie un tableau d'objets Order (ou un tableau vide si le résultat de la requête est vide).

Requête d'association de table intermédiaire

Parfois, certaines tables de données sont liées entre elles via une table intermédiaire (tableau croisé dynamique). Afin de déclarer une telle relation, nous pouvons personnaliser l'objet yiidbActiveQuery en appelant sa méthode via() ou viaTable().

Par exemple, si la table de commande order et l'élément de la table product sont liés via la table de connexion order_item, nous pouvons déclarer la relation items dans la classe Order comme suit :

class Order extends \yii\db\ActiveRecord
{
 public function getItems()
 {
  return $this->hasMany(Item::className(), [&#39;id&#39; => &#39;item_id&#39;])
   ->viaTable(&#39;order_item&#39;, [&#39;order_id&#39; => &#39;id&#39;]);
 }
}
Copier après la connexion
via () et viaTable() Similaires, mais le premier paramètre est un nom de relation déclaré dans la classe ActiveRecord actuelle, pas le nom de la table intermédiaire. Par exemple, la relation des éléments ci-dessus peut également être déclarée de la manière suivante :

class Order extends \yii\db\ActiveRecord
{
 public function getOrderItems()
 {
  return $this->hasMany(OrderItem::className(), [&#39;order_id&#39; => &#39;id&#39;]);
 }
 public function getItems()
 {
  return $this->hasMany(Item::className(), [&#39;id&#39; => &#39;item_id&#39;])
   ->via(&#39;orderItems&#39;);
 }
}
Copier après la connexion
Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. Pour un contenu plus connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Exemples d'utilisation de formulaire dans Yii

Analyse des requêtes liées à YII

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!

Étiquettes associées:
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