【特别注意事项】
1、所有要用于访问的属性,都要先在类中声明(原数据表中的字段是默认可访问的,自定义的属性值,一定要先在类中添加声明,才可以正常访问)
2、数据库的表面引用,一般都是有固定的数据库表前缀的,在类中,使用 {{tableName}} 代表着 table_pre.tableName
3、model()方法是 static 方法,不用实例化即可直接使用,多用于查询。
4、rules() 方法 是用来验证字段合法性的,而且可以设置每个规则的应用环境标示,如 'on'=>'search',这点要好好利用。
5、attributeLabels() 方法是设置每个字段的描述信息。
6、search()方法,用来查询

【如何获取关联数据表的其他字段值】
1)首先在关系声明里,指定要查询的字段别名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'visas'=>array(self::MANY_MANY, 'Visa',
                '{{visa_to_order}}(id_order, id_visa)',
                'select'=>array(
                    '*',                                  #获取所有字段
                   'visas_visas.price AS price_visa',     #visas_visas是关系表的别名,获取关系表里的字段值
                ),
            ),
 
            'user'=>array(self::BELONGS_TO, 'User','id_customer)'),
        );
    }

2)然后,将关系别名在AR实体里增加保存其值的属性。
class Visa extends CActiveRecord
{
    public $price_visa;
}

3)然后通过关联实体来访问该别名字段的值。
$orderModel->visas[0]->price_visa;


BELONGS_TO关系表,关联的keyid如何自定义指定

Yii的relations里self::BELONGS_TO默认是用当前指定的键跟关联表的主键进行join,例如:

return array(
'reply' => array(self::BELONGS_TO, 'BookPostReply', 'postid'),
);

默认生成的sql是 on id = postid,id是BookPostReply的主键。
但今天我遇到的需求却是需要生成 on BookPostReply.postid = t.postid,不去关联主键,

后来无意中看到有个on的属性,刚好跟sql里的on一样,于是抱着试试的想法,在配置里加了上去

return array(
'reply' => array(self::BELONGS_TO, 'BookPostReply', 'postid', 'on' => 't.postid=reply.postid'),
);

看调试信息里的SQL语句,发现yii生成了一条 on id = postid and t.postid=reply.postid 这样的语句,看到这就已经明白这个东西的作用了,于是将postid清空,改成如下:

return array(
'reply' => array(self::BELONGS_TO, 'BookPostReply', '', 'on' => 't.postid=reply.postid'),
);

其实,Yii的文档有说明: 如果你需要指定自定义的pk->fk关联,你可以定义数组(‘fk’=> ‘pk')。

【多条件下关联查询结果集】

案例:

$this->news = News::model()->with(array(

'sites'=>array('condition'=>'sites.id_site='.Yii::app()->params['siteId'],'together'=>true),

'categories'=>array('condition'=>'categories.id_category='.$this->categoryId,'together'=>true),

))->findAll(array(

'limit'=>$this->limit,

'condition'=>'t.active=1',

'order'=>'t.position'

));

使用with('关系名称1','关系名称2')方法,将延后查询关联表,

若如上案例,在with方法中,返回关系数组,将更灵活。

若想即时联合查询,需要添加'together'=>true属性值,才会组合为一句SQL进行查询。


我们来看下CActiveRecord.php文件里,yii是如何设计with()方法的。

/**

* Specifies which related objects should be eagerly loaded.

* This method takes variable number of parameters. Each parameter specifies

* the name of a relation or child-relation. For example,

* <pre>

* // find all posts together with their author and comments

* Post::model()->with('author','comments')->findAll();

* // find all posts together with their author and the author's profile

* Post::model()->with('author','author.profile')->findAll();

* </pre>

* The relations should be declared in {@link relations()}.

*

* By default, the options specified in {@link relations()} will be used

* to do relational query. In order to customize the options on the fly,

* we should pass an array parameter to the with() method. The array keys

* are relation names, and the array values are the corresponding query options.

* For example,

* <pre>

* Post::model()->with(array(

*     'author'=>array('select'=>'id, name'),

*     'comments'=>array('condition'=>'approved=1', 'order'=>'create_time'),

* ))->findAll();

* </pre>

*

* @return CActiveRecord the AR object itself.

*/

public function with()

{

if(func_num_args()>0)

{

$with=func_get_args();

if(is_array($with[0]))  // the parameter is given as an array

$with=$with[0];

if(!empty($with))

$this->getDbCriteria()->mergeWith(array('with'=>$with));

}

return $this;

}

我们再去看 CDbCriteria 类中的 mergeWith 方法定义:

/**

* Merges with another criteria.

* In general, the merging makes the resulting criteria more restrictive.

* For example, if both criterias have conditions, they will be 'AND' together.

* Also, the criteria passed as the parameter takes precedence in case

* two options cannot be merged (e.g. LIMIT, OFFSET).

* @param mixed $criteria the criteria to be merged with. Either an array or CDbCriteria.

* @param string|boolean $operator the operator used to concatenate where and having conditions. Defaults to 'AND'.

* For backwards compatibility a boolean value can be passed:

* - 'false' for 'OR'

* - 'true' for 'AND'

*/

public function mergeWith($criteria,$operator='AND'){......}

注意,这里就是我要强调的地方,yii默认且只执行关联表之间的AND条件查询,也就是说,在给定不同条件查询时,yii只为我们求取不同条件的交集结果返回。

但是在底层的CDbCriteria 类中,预留了参数$operator给我们。有需求的同学需要重写CActiveRecord来实现拓展了哦。

yii框架详解 之 CActiveRecord的更多相关文章

  1. yii框架详解 之 CWebApplication 运行流程分析

    在 程序入口处,index.php 用一句 Yii::createWebApplication($config)->run();  开始了app的运行. 那么,首先查看 CWebApplicat ...

  2. yii框架详解 之 国际化 (I18N)

    我们要开启组件中们关于语言的配置,默认的就是CPhpMessageSource,也可以改为其他的方式. #组件配置中  'messages' => array(     'class'=> ...

  3. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  4. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

  5. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  6. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂.Core Data 相关的类比较多,初学者往往不太容易弄懂.计划用三个教程来讲解这一部分: 框架详解 ...

  7. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

  8. Quartz.NET作业调度框架详解

    Quartz.NET作业调度框架详解 http://www.cnblogs.com/lmule/archive/2010/08/28/1811042.html

  9. mapreduce框架详解

    hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感 ...

随机推荐

  1. Java Programming Test Question 3

    import java.util.HashSet; public class JPTQuestion3 { public static void main(String[] args) { HashS ...

  2. 源码编译安装 screen

    本文转自:http://blog.163.com/oracle_wwf/blog/static/213030127201211191481101/ [root@web1 soft]# wget ftp ...

  3. CF459D Pashmak and Parmida's problem (树状数组)

    Codeforces Round #261 (Div. 2)   题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a ...

  4. PHP支付宝接口RSA验证

    这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享.    虽然支付宝官方还未提供相关SD ...

  5. ubuntu 14.04 安装mysql server的分支MariaDB Server初级教程

    序,MariaDB Server是Mysql的fork版本,与Mysql完美兼容,mysql在10年被sun收购,后sun被oracle收购,后mysql的创建者及项目长期技术带头人之一的Michae ...

  6. window 常用软件

    参考链接: http://www.aiweibang.com/yuedu/721140.html http://www.aiweibang.com/yuedu/145263218.html 1.wox ...

  7. HashMap原理分析

    HashMap 实现Map.Cloneable.Serializable接口,继承AbstractMap基类. HashMap map = new HashMap(); 实例化一个HashMap,在构 ...

  8. JQuery data方法的使用-遁地龙卷风

    (-1)说明 我用的是chrome49,这个方法涉及到JQuery版本问题,我手里有3.0的,有1.9.1,后面将1.9.1及其以前的称为低版本,3.0称为高版本 测试例子用到的showMessage ...

  9. IBM B16光纤交换机ZOON划分方法

      一.ZOON的含义及划分原则     Zoon在光纤存储交换机中的功能类似于以太网交换机VLAN的作用,主要是为了在一台交换机划分出多个逻辑区,用于防范不同应用的存储连接发起广播包,提高光纤交换机 ...

  10. iOS开发——网络篇——HTTP/NSURLConnection(请求、响应)、http响应状态码大全

    一.网络基础 1.基本概念> 为什么要学习网络编程在移动互联网时代,移动应用的特征有几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图只有通过网络跟外界进行数据交互.数据更新, ...