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, such as one-to-many correspondence, many-to-many correspondence, etc.
The Zend framework provides some methods to facilitate us to implement these relationships.
Define relationship:
The following is the relationship definition for the example used in this article:
<?php class Accounts extends Zend_Db_Table_Abstract { protected $_name = 'accounts'; protected $_dependentTables = array('Bugs'); } class class protected protected class protected } Products extends Zend_Db_Table_Abstract { protected $_name = 'products'; protected $_dependentTables = array('BugsProducts'); } Bugs extends Zend_Db_Table_Abstract { protected $_name = 'bugs';$_dependentTables = array('BugsProducts');$_referenceMap = array( 'Reporter' => array( 'columns' => 'reported_by', 'refTableClass' => 'Accounts', 'refColumns' => 'account_name' ), 'Engineer' => array( 'columns' => 'assigned_to', 'refTableClass' => 'Accounts', 'refColumns' => 'account_name' ), 'Verifier' => array( 'columns' => array('verified_by'), 'refTableClass' => 'Accounts', 'refColumns' => array('account_name') ) ); } BugsProducts extends Zend_Db_Table_Abstract { protected $_name = 'bugs_products';$_referenceMap = array( 'Bug' => array( 'columns' => array('bug_id'), 'refTableClass' => 'Bugs', 'refColumns' => array('bug_id') ), 'Product' => array( 'columns' => array('product_id'), 'refTableClass' => 'Products', 'refColumns' => array('product_id') ) );
We see four classes 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.
The $_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: (If there is no special explanation, they will be explained with the 'Reporter' relationship as above)
columns=> Set the field name associated with other tables. 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=> is 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 related table:
If we have already obtained a query result, we can obtain the query result of the table associated with this result through the following statement:
$row->findDependentRowset($table, [$rule]);
This method generally uses two entity tables corresponding to one-many. In the two entity tables and one relationship table corresponding to many-many, how to retrieve the data from one entity table and the other entity table will be described below.
The first field $table refers to the class name corresponding to the table associated with this table. 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. Here is an example:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsReportedByUser = $user1234->findDependentRowset('Bugs');
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, the first one associated with Account here is 'Reporter , so the Reporter records were 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('Bugs', 'Engineer');
In addition to using findDependentRowset, we can also use a mechanism called "Magic Method". The reason why it is called so is because it seems to be a magic trick. So the method findDependentRowset('
- $row->find
- $row->find
Note: This mechanism was first seen in Ruby on Rails. The
<?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('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); // Use the default reference rule $reporter = $bug1->findParentAccounts();// Specify the reference rule $engineer = $bug1->findParentAccountsByEngineer();
Get fields from parent table:
We have just introduced the method of getting from one to many in a one-many relationship. Now we reverse it and get one from many. In fact, we are getting the corresponding record from one of the 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. Here is an example:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?' => 'NEW')); $bug1 = $bugsRowset->current(); $reporter = $bug1->findParentRow('Accounts');
What is different 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('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); $engineer = $bug1->findParentRow('Accounts', 'Engineer');
Just fill in the Rules. Similarly, this method also has "magic fields". findParentRow('
- $row->findParent
- $row->findParent
例子:
取得多对多关系表的字段:
上面两个方法讲述了一对多的使用,下面就是多对多了。我们使用如下方法取得多对多关系表的数据:
$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('Products', 'BugsProducts');
下面是该方法的全部参数调用例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts', 'Bug');
这次的“魔术方法”是,对应 findManyToManyRowset('
- $row->find
- $row->find
- $row->find
例子:
<?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相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。