zoukankan      html  css  js  c++  java
  • yii多表关联

    1,首先多表关联是在models/xx.php的relations里配置的。而且是互配,但有区别。
    格式:
    'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)

    需要弄清楚的几点:
    1,VarName指什么?  详见下面例2。
    2,RelationType。一共有4种,分别为self::HAS_MANY, self::BELONGS_TO, self::MANY_MANY, self::HAS_ONE。
    3,ClassName。即关联的另一个../model/类名.php。
    4,ForeignKey。谁是谁的外键?写了是用主键关联,为空两个表不是用主键关联需要on
    5,附加条件

    两个表不是用主键关联

    'user' => array(self::BELONGS_TO, 'OaskUser', '' ,'on'=>'name=userName' , 'select'=>'TrueName'),
    Java代码  收藏代码
    1. 'varchar'=>array(self::HAS_ONE, 'CustomerEntityVarchar', 'entity_id','select'=>'varchar.value','on'=>'varchar.attribute_id="831"'),    

    BELONGS_TO(属于): 如果表 A 和 B 之间的关系是一对多,则 表 B 属于 表 A ;
    HAS_MANY(有多个): 如果表 A 和 B 之间的关系是一对多,则 A 有多个 B ;
    HAS_ONE(有一个): 这是 HAS_MANY 的一个特例,A 最多有一个 B ;
    MANY_MANY: 这个对应于数据库中的多对多关系。 由于多数 DBMS 不直接支持 多对多 关系,因此需要有一个关联表将多对多关系分割为一对多关系。在 AR术语中,我们可以解释 MANY_MANY 为 BELONGS_TO 和 HAS_MANY 的组合。

    STAT :除了上述的关系类型,一个特殊的关系,称为STAT也支持 可用于进行统计查询(或聚合查询) 。 检索聚合对相关对象的信息,如数量。如 一篇日志共有多少个评论

    php代码  收藏代码
    1. 'detailCounts' => array(self::STAT, 'PurchaseDetail', 'purchase_hid'),  

    例1,一对多关系 (post和user之间的关系)
    (1)models/Post.php

    Java代码  收藏代码
    1. class Post extends CActiveRecord  
    2. {  
    3.     ......  
    4.     public function relations()  
    5.     {  
    6.         return array(  
    7.             'author'=>array(self::BELONGS_TO, 'User', 'author_id'),  
    8.             'categories'=>array(self::MANY_MANY, 'Category',  
    9.                 'tbl_post_category(post_id, category_id)'),  
    10.         );  
    11.     }  
    12. }  

    其中Post与User的关系是BELONGS_TO(多对一)关系,并通过Post的author_id与User关联。Post中author_id是外键,关联到User中。注:此处的VarName是author,一个对象 。

    (2)models/User.php

    php代码  收藏代码
    1. class User extends CActiveRecord  
    2. {  
    3.     ......  
    4.     public function relations()  
    5.     {  
    6.         return array(  
    7.             'posts'=>array(self::HAS_MANY, 'Post', 'author_id'),  
    8.         );  
    9.     }  
    10. }  

    对于User,与Post的关系是属于HAS_MANY(一对多)关系。并通过Post的author_id与Post关联。 由于两者是一对多关系,所以要用posts

    例2,多对多关系。中间表名( 本表外键, many表外键 )

    在FailParts.php中

    php代码  收藏代码
    1. 'Users' => array(self::MANY_MANY, 'User', 'fail_parts_user(fail_parts_id, user_id)'),  

     在User.php中

    Java代码  收藏代码
    1. 'FailParts' => array(self::MANY_MANY, 'FailParts', 'fail_parts_user(user_id, fail_parts_id)'),  

    由于两者是多对多关系,所以要用Users ,而不是User;要用FailParts,而不是FailPart。此处的Users和FailParts,即为前面的VarName。

    例3,一对一关系。比较简单,暂略。
    2,关于VarName。
    对于类A.php,'VarName'=>array('RelationType', 'B', 'ForeignKey', ...additional options)
    其中VarName与B基本相同。但未必完全一样。此时就可以在A的views/A/xx.php中通过VarName来访问B及其属性值了。

    如果是一对一:A->VarName
    如果是一对多:A->VarName->name
    如果是多对多:

    php代码  收藏代码
    1. $users = As->VarName  
    2. foreach($users as $u){  
    3.    $_tmp_users[] = $u -> getName;  
    4. }  
    5. userStr = implode(', ', $_tmp_users);   

     懒惰式加载(lazy loading,也可译为 迟加载) 方式

    php代码  收藏代码
    1. // 获取 ID 为 10 的帖子  
    2. $post=Post::model()->findByPk(10);  
    3. // 获取帖子的作者(author): 此处将执行一个关联查询。  
    4. $author=$post->author;  

    懒惰式加载用起来很方便,但在某些情况下并不高效。
    渴求式加载(eager loading)方式。$posts=Post::model()->with('author','categories')->findAll();

    AR scopes

    php代码  收藏代码
      1. //SchoolDepartment::model()->allDepartmentAndClass($id)->findAll();  
      2. public function relations() {  
      3.     return array(  
      4.         'class' => array(self::HAS_MANY, 'SchoolClass', 'school_department_id'),  
      5.     );  
      6. }  
      7.   
      8. public function scopes() {  
      9.     return array(  
      10.         'allDepartmentAndClass',  
      11.     );  
      12. }  
      13.   
      14. public function allDepartmentAndClass($id) {  
      15.     $this->getDbCriteria()->mergeWith(array(  
      16.         'with' => "class",  
      17.         'condition' => "t.tbl_school_id=$id",  
      18.     ));  
      19.     return $this;  
      20. }  
  • 相关阅读:
    Insus Meta Utility
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    Insus Binary Utility
    asp.net实现文件下载功能
    Column 'Column Name' does not belong to table Table
    程序已被编译为DLL,怎样去修改程序功能
    如何在Web网站实现搜索功能
    如何把数据流转换为二进制字符串
    Asp.net更新文件夹的文件
    如何显示中文月份
  • 原文地址:https://www.cnblogs.com/liuwenbohhh/p/4346687.html
Copyright © 2011-2022 走看看