Maison  >  Article  >  php教程  >  Explication détaillée des exemples d'association de tables Zend_Db_Table dans le tutoriel Zend Framework

Explication détaillée des exemples d'association de tables Zend_Db_Table dans le tutoriel Zend Framework

高洛峰
高洛峰original
2017-01-05 09:40:451122parcourir

L'exemple de cet article décrit l'utilisation de l'association de tables Zend_Db_Table dans Zend Framework. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Introduction :

Dans le SGBDR, il existe diverses relations entre les tables, la correspondance un-plusieurs, plusieurs-plusieurs, etc.

Le framework Zend fournit quelques méthodes pour nous faciliter la mise en œuvre de ces relations.

Définir la relation :

Voici la définition de la relation pour l'exemple utilisé dans cet article :

<?php
class Accounts extends Zend_Db_Table_Abstract
{
  protected $_name      = &#39;accounts&#39;;
  protected $_dependentTables = array(&#39;Bugs&#39;);
}
class
class
  protected
  protected
class
  protected
}
Products extends Zend_Db_Table_Abstract
{
  protected $_name      = &#39;products&#39;;
  protected $_dependentTables = array(&#39;BugsProducts&#39;);
}
Bugs extends Zend_Db_Table_Abstract
{
  protected $_name      = &#39;bugs&#39;;$_dependentTables = array(&#39;BugsProducts&#39;);$_referenceMap  = array(
    &#39;Reporter&#39; => array(
      &#39;columns&#39;      => &#39;reported_by&#39;,
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => &#39;account_name&#39;
    ),
    &#39;Engineer&#39; => array(
      &#39;columns&#39;      => &#39;assigned_to&#39;,
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => &#39;account_name&#39;
    ),
    &#39;Verifier&#39; => array(
      &#39;columns&#39;      => array(&#39;verified_by&#39;),
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => array(&#39;account_name&#39;)
    )
  );
}
BugsProducts extends Zend_Db_Table_Abstract
{
  protected $_name = &#39;bugs_products&#39;;$_referenceMap  = array(
    &#39;Bug&#39; => array(
      &#39;columns&#39;      => array(&#39;bug_id&#39;),
      &#39;refTableClass&#39;   => &#39;Bugs&#39;,
      &#39;refColumns&#39;    => array(&#39;bug_id&#39;)
    ),
    &#39;Product&#39; => array(
      &#39;columns&#39;      => array(&#39;product_id&#39;),
      &#39;refTableClass&#39;   => &#39;Products&#39;,
      &#39;refColumns&#39;    => array(&#39;product_id&#39;)
    )
  );

Nous voyons que quatre classes sont définies dans l'exemple : Comptes, produits, bugs, BugsProducts. Parmi eux, Accounts, Products et Bugs sont trois tables d'entités, et BugsProducts est une table de relations.

Analysons à nouveau ces trois entités. Un compte a plusieurs bugs. Il existe une relation un-à-plusieurs entre eux, tandis que Bug et Product ont une relation plusieurs-à-plusieurs.

$_dependentTables est un nom d'objet associé à l'objet. Notez ici que vous devez écrire le nom de l'objet au lieu du nom de la base de données associée.

Le tableau $_referenceMap est utilisé pour définir la relation avec d'autres tables. Ici, vous pouvez définir la relation avec ces tables et le type de relation qui existe. La première chose à définir est la clé de règle, qui est le « Reporter », « l'Ingénieur » et autres dans l'exemple ci-dessus. La fonction de Rule Key est en fait le nom d'une relation, et il n'est pas nécessaire qu'elle soit la même que le nom d'autres noms de tables de base de données ou d'autres noms d'objets. Juste pour le marquage, nous pourrons voir le rôle de cette Rule Key plus tard.

Chaque règle a les définitions suivantes : (Aucune instruction particulière, toutes sont expliquées avec la relation 'Reporter' comme ci-dessus)

columns=> report_by' ci-dessus est le champ report_by du tableau Bugs dans la base de données. Il n'y a qu'un seul champ ici, mais vous pouvez également définir plusieurs champs.

refTableClass=> est utilisé pour définir la table liée à cette table. Notez ici que vous devez utiliser le nom de l'objet de la table cible au lieu du nom de la table. Dans l'exemple, il est associé à l'objet 'Compte'.

refColumns =>Définissez les champs de la table où se produit le contact. Vous pouvez en écrire plusieurs. S'il est lié à plusieurs champs, il doit correspondre à des colonnes. Ce paramètre est en fait facultatif. S'il est vide, le champ associé est automatiquement défini comme clé primaire de la table associée. Dans l'exemple ci-dessus, la clé primaire n'est pas utilisée comme champ associé, elle est donc définie manuellement.

onDelete=> Champ facultatif, définissez l'action lors de la suppression.
onUpdate=> Champ facultatif, définit l'action lors de la mise à jour de la table.

Ce qui précède définit la relation.

Récupérer les données de la table associée :

Si nous avons déjà obtenu un résultat de requête, nous pouvons utiliser l'instruction suivante pour obtenir le résultat de requête de la table associée à ce résultat :

$row->findDependentRowset($table, [$rule]);

Cette méthode utilise généralement deux tables d'entités correspondant à un-plusieurs. Dans les deux tables d'entités et une table de relations correspondant à plusieurs-plusieurs, comment récupérer les données d'une table d'entités et de l'autre table d'entités sera. décrit ci-dessous.

Le premier champ $table fait référence au nom de classe correspondant à la table à laquelle cette table est associée. Le deuxième champ est facultatif et correspond à la clé de règle que nous venons de mentionner, qui est le nom de la relation. S'il est omis, il s'agit par défaut de la première relation du tableau. Voici un exemple :

<?php
$accountsTable   = new Accounts();
$accountsRowset   = $accountsTable->find(1234);
$user1234      = $accountsRowset->current();
$bugsReportedByUser = $user1234->findDependentRowset(&#39;Bugs&#39;);

Dans l'exemple, nous avons d'abord lu un utilisateur numéroté 1234, puis avons trouvé quel bug ce type a signalé puisque zend est la première association par défaut, ici et La première. associé au compte est « Reporter », donc l'enregistrement Reporter est supprimé.

Si nous voulons supprimer d'autres enregistrements, comme Engineer, nous pouvons suivre la méthode suivante :

<?php
$accountsTable   = new Accounts();
$accountsRowset   = $accountsTable->find(1234);
$user1234      = $accountsRowset->current();
$bugsAssignedToUser = $user1234->findDependentRowset(&#39;Bugs&#39;, &#39;Engineer&#39;);

En plus d'utiliser findDependentRowset, nous pouvons également utiliser ce qu'on appelle le " Méthode Magique"). La raison pour laquelle on l’appelle ainsi est parce que cela semble être un tour de magie. Ainsi, la méthode findDependentRowset('466dc5544709fe84511a904abed374b4', '2beb20eacf4e4efa7b66c106c6dc0e29') peut être équivalente à ce qui suit :

- $row->find466dc5544709fe84511a904abed374b4()
- $row - >find466dc5544709fe84511a904abed374b4By2beb20eacf4e4efa7b66c106c6dc0e29()

Remarque : ce mécanisme a été vu pour la première fois dans Ruby on Rails. Les champs 466dc5544709fe84511a904abed374b4 et 2beb20eacf4e4efa7b66c106c6dc0e29 doivent ici être exactement identiques au nom de la classe et au nom de l'association associés (clé de règle) avant qu'ils puissent prendre effet. Voici un exemple :

<?php
$accountsTable  = new Accounts();
$accountsRowset  = $accountsTable->find(1234);
$user1234     = $accountsRowset->current();
// Use the default reference rule
$bugsReportedBy  = $user1234->findBugs();// Specify the reference rule
$bugsAssignedTo  = $user1234->findBugsByEngineer();
<?php
$bugsTable     = new Bugs();
$bugsRowset    = $bugsTable->fetchAll(&#39;bug_status = ?&#39;, &#39;NEW&#39;);
$bug1       = $bugsRowset->current();
// Use the default reference rule
$reporter     = $bug1->findParentAccounts();// Specify the reference rule
$engineer     = $bug1->findParentAccountsByEngineer();

Obtenir les champs de la table parent :

Nous venons d'introduire la méthode permettant de passer de un à plusieurs dans une relation un-plusieurs. nous procédons dans l'autre sens, à partir de Prendre un parmi plusieurs signifie en fait prendre l'enregistrement correspondant d'un parmi plusieurs.

De même, nous avons cette déclaration :

$row->findParentRow($table, [$rule]);

De même, $table est le nom de la classe et le paramètre facultatif $rule est renseigné avec la clé de règle correspondante. Voici un exemple :

<?php
$bugsTable     = new Bugs();
$bugsRowset    = $bugsTable->fetchAll(array(&#39;bug_status = ?&#39; => &#39;NEW&#39;));
$bug1       = $bugsRowset->current();
$reporter     = $bug1->findParentRow(&#39;Accounts&#39;);

Ce qui est différent de ce qui précède, c'est que ce qui est renvoyé ci-dessus est un ensemble de plusieurs enregistrements, et ce qui est renvoyé cette fois doit être un seul enregistrement. L'exemple suivant consiste à définir la règle :

<?php
$bugsTable     = new Bugs();
$bugsRowset    = $bugsTable->fetchAll(&#39;bug_status = ?&#39;, &#39;NEW&#39;);
$bug1       = $bugsRowset->current();
$engineer     = $bug1->findParentRow(&#39;Accounts&#39;, &#39;Engineer&#39;);

Remplissez simplement la règle. De même, cette méthode possède également des « champs magiques ». findParentRow('466dc5544709fe84511a904abed374b4', '2beb20eacf4e4efa7b66c106c6dc0e29') correspond à :

- $row->findParent466dc5544709fe84511a904abed374b4()
- $row->findParent466dc5544709fe84511a904abed374b4 By< ;Rule>()

Exemple :

Récupérez les champs de la table de relations plusieurs-à-plusieurs :

上面两个方法讲述了一对多的使用,下面就是多对多了。我们使用如下方法取得多对多关系表的数据:

$row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2]]);

这里参数变成了4个,因为需要增加一个关系表来存储多对多的关系。

$table是与之发生多对多关系的表的类名,$intersectionTable是中间存储关系的关系表的类名。$rule1和$rule2是上面两个数据表的Rule Key。省略Rule Key的例子如下:

<?php
$bugsTable    = new Bugs();
$bugsRowset    = $bugsTable->find(1234);
$bug1234     = $bugsRowset->current();
$productsRowset  = $bug1234->findManyToManyRowset(&#39;Products&#39;, &#39;BugsProducts&#39;);

下面是该方法的全部参数调用例子:

<?php
$bugsTable    = new Bugs();
$bugsRowset    = $bugsTable->find(1234);
$bug1234     = $bugsRowset->current();
$productsRowset  = $bug1234->findManyToManyRowset(&#39;Products&#39;, &#39;BugsProducts&#39;, &#39;Bug&#39;);

这次的“魔术方法”是,对应 findManyToManyRowset('466dc5544709fe84511a904abed374b4', '97f753065e45ecb7b12f397f16a11d32', 'beb088a48936a0c6bbd9bd3b2a614a2c', 'b036790bae3f5db7e75b614ff74a9b53')
- $row->find466dc5544709fe84511a904abed374b4Via97f753065e45ecb7b12f397f16a11d32()
- $row->find466dc5544709fe84511a904abed374b4Via97f753065e45ecb7b12f397f16a11d32Bybeb088a48936a0c6bbd9bd3b2a614a2c()
- $row->find466dc5544709fe84511a904abed374b4Via97f753065e45ecb7b12f397f16a11d32Bybeb088a48936a0c6bbd9bd3b2a614a2cAndb036790bae3f5db7e75b614ff74a9b53()

例子:

<?php
$bugsTable    = new Bugs();
$bugsRowset    = $bugsTable->find(1234);
$bug1234     = $bugsRowset->current();
// Use the default reference rule
$products     = $bug1234->findProductsViaBugsProducts();// Specify the reference rule
$products     = $bug1234->findProductsViaBugsProductsByBug();

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

更多Zend Framework教程之Zend_Db_Table表关联实例详解相关文章请关注PHP中文网!

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