Home > Backend Development > PHP Tutorial > Zend Framework tutorial Zend_Db_Table table association example detailed explanation, zendzend_db_table_PHP tutorial

Zend Framework tutorial Zend_Db_Table table association example detailed explanation, zendzend_db_table_PHP tutorial

WBOY
Release: 2016-07-12 08:56:15
Original
760 people have browsed it

Detailed explanation of Zend_Db_Table table association examples in Zend Framework tutorial, zendzend_db_table

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:

<&#63;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')
    )
  );

Copy after login

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

Copy after login

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:

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

Copy after login

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:

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

Copy after login

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('', '') can be equivalent to the following:

- $row->find()
- $row->findBy()

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

<&#63;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();

Copy after login
<&#63;php
$bugsTable     = new Bugs();
$bugsRowset    = $bugsTable->fetchAll('bug_status = &#63;', 'NEW');
$bug1       = $bugsRowset->current();
// Use the default reference rule
$reporter     = $bug1->findParentAccounts();// Specify the reference rule
$engineer     = $bug1->findParentAccountsByEngineer();

Copy after login

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

Copy after login

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

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

Copy after login

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:

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

Copy after login

Just fill in the Rules. Similarly, this method also has "magic fields". findParentRow('', '') corresponds to:

- $row->findParent()
- $row->findParentBy()

例子:

取得多对多关系表的字段:

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

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

Copy after login

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

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

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

Copy after login

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

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

Copy after login

这次的“魔术方法”是,对应 findManyToManyRowset('', '', '', '')
- $row->findVia()
- $row->findViaBy()
- $row->findViaByAnd()

例子:

<&#63;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();

Copy after login

更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

您可能感兴趣的文章:

  • Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
  • Zend Framework教程之Zend_Db_Table_Row用法实例分析
  • Zend Framework教程之Zend_Db_Table用法详解
  • Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
  • Zend Framework开发入门经典教程
  • Zend Framework框架Smarty扩展实现方法
  • Zend Framework框架路由机制代码分析
  • Zend Framework实现具有基本功能的留言本(附demo源码下载)
  • Zend Framework实现将session存储在memcache中的方法
  • Zend Framework分页类用法详解
  • Zend Framework实现多文件上传功能实例
  • Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
  • Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1113708.htmlTechArticleZend Framework教程之Zend_Db_Table表关联实例详解,zendzend_db_table 本文实例讲述了Zend Framework中Zend_Db_Table表关联用法。分享给大家供大家参考,具...
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template