Home  >  Article  >  php教程  >  Detailed explanation of Zend_Db_Table table association examples in Zend Framework tutorial

Detailed explanation of Zend_Db_Table table association examples in Zend Framework tutorial

高洛峰
高洛峰Original
2017-01-05 09:40:451122browse

The example in this article describes the usage of Zend_Db_Table table association in Zend Framework. Share it with everyone for your reference, the details are as follows:

Introduction:

In RDBMS, there are various relationships between tables, one-to-many correspondence, many-to-many correspondence, etc.

The Zend framework provides some methods to facilitate us to realize these relationships.

Definition of relationship:

The following is the relationship definition of the example used in this 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;)
    )
  );

We see that four classes are defined in the example: Accounts, Products, Bugs, BugsProducts . Among them, Accounts, Products and Bugs are three entity tables, and BugsProducts is a relationship table.

Let’s analyze these three entities again. An Account has multiple Bugs. There is a one-to-many relationship between them, while Bug and Product have a many-to-many relationship.

$_dependentTables is an object name associated with the object. Note here that you should write the object name instead of the associated database name.

$_referenceMap array is used to define the relationship with other tables. Here you can set the relationship with those tables and what kind of relationship there is. The first thing to set is the Rule Key, which is the 'Reporter', 'Engineer' and the like in the above example. The function of Rule Key is actually the name of a relationship, and it does not need to be the same as the name of other database table names or other object names. Just for marking, we can see the role of this Rule Key later.

There are some definitions below each Rule: (No special instructions, all are explained with the 'Reporter' relationship as above)

columns=> Set fields associated with other tables name, the 'report_by' above is the report_by field of the table Bugs in the database. There is only one field here, but multiple fields can also be set.

refTableClass=>Used to set the table that is related to this table. Note here that you must use the name of the object of the target table instead of the table name. In the example, it is associated with the 'Account' object.

refColumns =>Set the fields of the table where the contact occurs. You can write more than one. If it is related to multiple fields, it should correspond to columns. This setting is actually optional. If it is empty, the related field is automatically set as the primary key of the related table. In the above example, the primary key is not used as the related field, so it is set manually.

onDelete=> Optional field, set the action when deleting.
onUpdate=> Optional field, set the action when updating the table.

The above defines the relationship.

Get data from the associated table:

If we have already obtained a query result, we can use the following statement to obtain the query result of the table associated with this result:

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

This method is generally used in the two entity tables corresponding to Duoduo. In the two entity tables and a relationship table corresponding to Duoduo, how to retrieve data from one entity table and another entity table will be described below.

The first field $table refers to the class name corresponding to the table that this table is associated with. The second field is optional and is the rule key we just mentioned, which is the name of the relationship. If omitted, it defaults to the first relationship in the table. The following is an example:

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

In the example, we first read a user numbered 1234, and then found out what bug this guy reported. Since zend is the first association by default, it occurs with Account. The first one associated is 'Reporter, so the Reporter record is taken out.

If we want to take out other records, such as Engineer, we can follow the following method:

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

In addition to using findDependentRowset, we can also use something called "Magic Method" mechanism. The reason why it is called so is because it seems to be a magic trick. So the method findDependentRowset('466dc5544709fe84511a904abed374b4', '2beb20eacf4e4efa7b66c106c6dc0e29') can be equivalent to the following:

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

Note: This mechanism was first seen in Ruby on Rails. The 466dc5544709fe84511a904abed374b4 and 2beb20eacf4e4efa7b66c106c6dc0e29 here must be exactly the same as the associated class name and association name (Rule Key) before they can take effect. The following is an example:

<?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();

Obtain fields from the parent table:

We just introduced the method of getting from one to many in a one-many relationship. Now we turn around and get one from many. In fact, It is to take the corresponding record from one of many.

Similarly, we have this statement:

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

Similarly, $table is the class name, and the optional parameter $rule is filled in with the corresponding Rule Key. The following is an example:

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

The difference from the above is that what is returned above is a collection of multiple records, and what is returned this time must be one record. The following example is to set the Rule:

<?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;);

Just fill in the Rule. Similarly, this method also has "magic fields". findParentRow('466dc5544709fe84511a904abed374b4', '2beb20eacf4e4efa7b66c106c6dc0e29') corresponds to:

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

Example:

Get the fields of the many-to-many relationship table:

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

$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中文网!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn