Maison  >  Article  >  cadre php  >  Explication détaillée de la fonction de corrélation de requêtes de ThinkPHP

Explication détaillée de la fonction de corrélation de requêtes de ThinkPHP

PHPz
PHPzoriginal
2023-04-11 10:30:151995parcourir

Avec le développement continu du développement Web, la corrélation des requêtes est devenue une exigence très courante. De nombreux frameworks fournissent également des interfaces pratiques de corrélation de requêtes. ThinkPHP est un framework PHP extrêmement populaire. Il fournit de puissantes fonctions de corrélation de requêtes et peut répondre aux différents besoins des développeurs. Cet article expliquera en détail la fonction de corrélation de requêtes de ThinkPHP.

1. Association modèle

1.1 Association un-à-un

L'association un-à-un signifie qu'il n'y a qu'un seul enregistrement dans chacune des deux tables de données. Dans ce cas, utilisez hasOne() et appartiennentTo(. ) fonctions pour réaliser l'association. Supposons que nous ayons deux tables, l'une est la table user et l'autre est la table userinfo. La structure des deux tables est la suivante :

user:
id
name

userinfo:
id
user_id
age

Les deux tables ci-dessus sont liées via le champ user_id. Nous souhaitons maintenant retrouver les informations utilisateur dans la table user et l'âge de l'utilisateur. Les opérations spécifiques sont les suivantes :

Définir une méthode userinfo() dans le modèle User, avec n'importe quel nom de méthode.

//User模型

<?php

class User extends Model{
public function userinfo(){
return $this -> hasOne('UserInfo', 'user_id');
}
}

Définissez une méthode age() dans le modèle User. Cette méthode définit en fait un attribut qui accède au champ age du modèle userinfo.

//User模型
<?php

class User extends Model{
protected $readonly = [&#39;age&#39;];

public function userinfo(){
return $this -> hasOne('UserInfo', 'user_id');
}

public function getAgeAttr($value, $data){
if(isset($data['userinfo'])){
return $data['userinfo']['age'];
}
return '';
}
}

Après avoir terminé le code ci-dessus, nous pouvons utiliser la méthode find() pour interroger l'utilisateur souhaité et son âge :

//查询user表中id为1的用户

$user = User::get(1);
echo $user -> name;
echo $user -> age;

Remarque : dans le code ci-dessus, nous utilisons l'attribut $readonly, et l'attribut $readonly est ThinkPHP Fournit des attributs qui peuvent empêcher certains attributs d'être écrits dans la base de données. Dans le code ci-dessus, nous définissons l'attribut age comme attribut en lecture seule, de sorte que lors de l'accès à $user -> age, la méthode getAgeAttr sera automatiquement appelée pour interroger le champ age dans le modèle userinfo.

1.2 Association un-à-plusieurs

L'association un-à-plusieurs signifie que l'une des deux tables de données a plusieurs enregistrements et l'autre n'a qu'un seul enregistrement. Comme l'exemple suivant :

order:
id
user_id
order_no

order_goods:
id
order_id
name
price

Les deux tables ci-dessus sont liées via le champ order_id. Nous devons maintenant trouver les informations de commande de l'utilisateur et les informations sur le produit correspondantes dans la table user. Les opérations spécifiques sont les suivantes :

Définir une méthode commandes() dans le modèle User. Cette méthode indique qu'un utilisateur a plusieurs commandes.

//User模型

<?php
class User extends Model{
public function orders(){
return $this -> hasMany('Order', 'user_id');
}
}

Définissez une méthode Goods() dans le modèle Order. Cette méthode indique qu'une commande comporte plusieurs produits.

//Order模型
<?php
class Order extends Model{
public function goods(){
return $this -> hasMany('OrderGoods', 'order_id');
}
}

Après avoir défini l'association ci-dessus, nous pouvons utiliser la méthode find() pour interroger les commandes de l'utilisateur et les produits correspondant à chaque commande :

//查询user表中id为1的用户的订单信息和订单的商品信息

$user = User::get(1, 'orders.goods');
var_dump($user -> orders[0] -> goods);

Le dernier paramètre («orders.goods») signifie interroger tous ses articles à en même temps les informations sur la commande et les marchandises liées à la commande.

2. Association de requêtes

2.1 Utilisation d'une requête d'association

En plus de définir des relations d'association au niveau du modèle, nous pouvons également implémenter des requêtes d'association en appelant les propriétés d'association de la couche modèle. Par exemple, nous voulons maintenant interroger un utilisateur et ses informations de commande :

$user = User::get(1);
$orders = $user -> orders;
echo $user -> name;
foreach($orders as $order){
echo $order -> order_no . "\n";
}

2.2 Association retardée

Si nous ne voulons pas interroger automatiquement son association lors de l'interrogation d'un modèle, nous pouvons utiliser l'association retardée pour répondre à cette exigence. Par exemple :

$user = User::with('orders')->get(1);

Dans le code ci-dessus, lorsque nous définissons la variable $user, nous avons défini l'association à obtenir dans la fonction with(). À ce stade, l'instruction de requête n'interrogera pas automatiquement l'association par défaut, mais. attendra que nous utilisions l'association.

2.3 Contenant des associations

En plus de l'association retardée ci-dessus, nous pouvons également inclure automatiquement toutes les associations en définissant le paramètre true après la méthode with pour répondre à nos besoins de requête. Par exemple :

$user = User::with('orders')->find(1, true);

Dans le code ci-dessus, nous avons ajouté un paramètre true à la méthode find(). Ce paramètre indique que nous souhaitons inclure toutes les associations du modèle utilisateur.

Ce qui précède explique comment utiliser la corrélation de requêtes ThinkPHP. La fonction de corrélation de requêtes de ThinkPHP est très puissante et peut répondre à la plupart des besoins de développement.

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