Maison  >  Article  >  développement back-end  >  Framework de développement PHP Tutoriel Yii Framework (27) Exemple d'enregistrement actif associé à une base de données

Framework de développement PHP Tutoriel Yii Framework (27) Exemple d'enregistrement actif associé à une base de données

黄舟
黄舟original
2017-01-22 09:30:551406parcourir

Nous avons vu comment utiliser Active Record (AR) pour obtenir des données à partir d'une seule table de données. Dans cette section, nous expliquons comment utiliser AR pour connecter plusieurs tables de données associées et récupérer l'ensemble de données joint.

Afin d'utiliser la RA relationnelle, nous vous recommandons de définir des contraintes clé primaire-clé étrangère dans les tables qui doivent être liées. Ces contraintes peuvent contribuer à garantir la cohérence et l’intégrité des données associées.

Cet exemple présente comment utiliser Active Record pour plusieurs tables liées en modifiant l'exemple de générateur de requêtes de base de données du didacticiel de développement du framework Yii (25).

Avant d'utiliser AR pour effectuer des requêtes associées, nous devons faire savoir à AR comment une classe AR est liée à une autre.

La relation entre deux classes AR est directement liée à travers la relation entre les tableaux de données représentés par les classes AR. Du point de vue d'une base de données, il existe trois types de relations entre les tables A et B : un-à-plusieurs (comme tbl_user et tbl_post), un-à-un (comme tbl_user et tbl_profile) et plusieurs-à-un Many ( plusieurs à plusieurs tels que tbl_category et tbl_post). En AR, il existe quatre relations :

BELONGS_TO (appartient à) : Si la relation entre les tables A et B est un-à-plusieurs, alors la table B appartient à la table A (par exemple, Post appartient à l'utilisateur );

HAS_MANY (il y en a plusieurs) : si la relation entre les tables A et B est de un à plusieurs, alors A a plusieurs B (par exemple, l'utilisateur a plusieurs publications

HAS_ONE (il y en a un) : Il s'agit d'un cas particulier de HAS_MANY : A peut avoir au plus un B (par exemple, l'utilisateur peut avoir au plus un profil

MANY_MANY : cela correspond aux plusieurs-) ; relation à plusieurs dans la base de données. Étant donné que la plupart des SGBD ne prennent pas directement en charge les relations plusieurs-à-plusieurs, une table de relations est nécessaire pour diviser la relation plusieurs-à-plusieurs en une relation un-à-plusieurs. Dans notre exemple de structure de données, tbl_post_category est utilisé à cette fin. En termes AR, nous pouvons interpréter MANY_MANY comme la combinaison de BELONGS_TO et HAS_MANY. Par exemple, Post appartient à plusieurs (appartient à plusieurs) Catégorie, Catégorie a plusieurs (a plusieurs) Post.

La relation définie dans AR doit remplacer la méthode relations() dans CActiveRecord. Cette méthode renvoie un tableau de configurations de relations. Chaque élément du tableau représente une relation unique au format suivant.

Dans Query Builder, nous avons utilisé l'instruction de requête SQL suivante

SELECT c.FirstName, c.LastName , c.Address,c.Email
FROM customer c
INNER JOIN
employee e
ON c.SupportRepId=e.EmployeeId

WHERE e.EmployeeId=4 implique deux tables Employee et Customer, entre Employee et Customer Un one-to- De nombreuses relations signifient qu'un employé peut être responsable de plusieurs clients. La relation entre l'employé et le client est HAS_MANY et la relation entre le client et l'employé est HAS_ONE. Ainsi, Employé et Client peuvent être définis comme suit :

//Customer.phpclass Customer extends CActiveRecord{
public static function model($className=__CLASS__){return parent::model($className);}
public function tableName(){return 'Customer';}
}
//Employee.phpclass Employee extends CActiveRecord{
public static function model($className=__CLASS__){return parent::model($className);}
public function tableName(){return 'Employee';}
public function relations(){return array('customers'=>array(self::HAS_MANY, 'Customer', 'SupportRepId'),
);}}
Comme cet exemple utilise uniquement le Client correspondant à la requête Employé, seule la méthode des relations est définie pour la classe. Les tables et clés étrangères correspondantes sont Customer et SupportRepId.

Modifiez ensuite la méthode indexAction de SiteController :

public function actionIndex(){
$employee=Employee::model()->findByPk(4);
$this->render('index', array('model' => $employee->customers,
));}
La définition de relation dans la classe AR ajoute implicitement un attribut à la classe pour chaque relation. Une fois une requête de corrélation exécutée, les attributs correspondants seront renseignés avec l'instance AR associée. Par conséquent, l'enregistrement Clients correspondant à Employé peut être interrogé auprès de $employee->clients.

Le moyen le plus simple d'effectuer une requête de corrélation consiste à lire la propriété de corrélation dans une instance AR. Si cette propriété n'a pas été accédée auparavant, une requête de jointure sera initialisée qui joindra les deux tables et filtrera à l'aide de la clé primaire de l'instance AR actuelle. Les résultats de la requête sont enregistrés dans la propriété en tant qu'instance de la classe AR associée. Il s'agit de la légendaire méthode de chargement paresseux (lazy chargement, également traduit par chargement paresseux). Par exemple, une requête associée n'est exécutée que lorsque l'objet associé est accédé pour la première fois.
Cet exemple utilise un chargement paresseux, qui n'est pas efficace dans certains cas. Si nous voulons obtenir les auteurs de N articles, l’utilisation de ce chargement paresseux entraînera l’exécution de N requêtes de jointure. Dans ce cas, nous devrions plutôt utiliser le chargement hâtif.
La méthode de chargement hâtif obtiendra l'instance AR associée tout en obtenant l'instance AR principale. Cela se fait en utilisant la méthode with lors de l'utilisation des méthodes find ou findAll dans AR. Par exemple :

$employee=Post::model()->with ('customers')->findAll();
Modifiez enfin le code de la Vue qui affiche les résultats :


$customer){
echo 'First Name:' . $customer->FirstName . '';
echo 'Last Name:' . $customer->LastName . '';
echo 'Address:' . $customer->Address . '';
echo 'Email:' . $customer->Email . '';
echo '----------------------';}
?>
Différentes données gèrent différemment la casse des noms de colonnes, et certaines bases de données différencient entre les tailles. Par mesure de sécurité, utilisez la même casse pour l'attribut Customer que pour la définition de la colonne.

Framework de développement PHP Tutoriel Yii Framework (27) Exemple denregistrement actif associé à une base de données

Cet exemple présente l'utilisation la plus basique de l'Active Record associé. Pour d'autres fonctions et propriétés, veuillez vous référer à la documentation chinoise de Yii. De plus, si vous utilisez des outils comme CodeSmith, si vous le pouvez, la génération automatique de code ActiveRecord défini par la base de données peut réduire considérablement la charge de travail de codage manuel du programmeur.

De plus, la commodité d'utiliser Active Record se fait au détriment des performances. Généralement, les performances de l'utilisation d'Active Record sont un niveau pire que celles de l'utilisation de DAO pour lire et écrire des bases de données. Le tableau suivant est une valeur de référence pour trouver 200 acteurs et 1000 films.

Framework de développement PHP Tutoriel Yii Framework (27) Exemple denregistrement actif associé à une base de données

Ce qui précède est le contenu du tutoriel du framework de développement PHP Yii Framework (27) exemple d'enregistrement actif associé à une base de données. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

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