YII Framework学习教程-YII的Model-数据库操作2-多关系的CActiveRecord使用举例

上面把多关系的CActiveRecord翻译了一通,

这里只是讲一些比较常用的选项,不会面面具到的讲所有的选项。具体的还要在开发中慢慢体会。

具体代码如下,注释中稍作注释,便于理解:

相关的数据库代码

# --------------------------------------------------------
# Host:                         10.0.2.2
# Server version:               5.1.58-1ubuntu1
# Server OS:                    debian-linux-gnu
# HeidiSQL version:             6.0.0.3603
# Date/time:                    2011-11-30 19:33:04
# --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

# Dumping structure for table testdrive.tbl_profile
CREATE TABLE IF NOT EXISTS `tbl_profile` (
  `owner_id` int(11) NOT NULL DEFAULT '0',
  `nickname` varchar(50) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `regdate` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`owner_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

# Dumping data for table testdrive.tbl_profile: 0 rows
/*!40000 ALTER TABLE `tbl_profile` DISABLE KEYS */;
INSERT INTO `tbl_profile` (`owner_id`, `nickname`, `birthday`, `regdate`) VALUES
	(1, '1', '0000-00-00', '2011-11-30 14:32:01'),
	(2, '2', '2011-11-21', '2011-11-30 14:32:01'),
	(3, '3', '0000-00-00', '2011-11-30 14:32:01'),
	(4, '3', '0000-00-00', '2011-11-30 14:32:01');
/*!40000 ALTER TABLE `tbl_profile` ENABLE KEYS */;


# Dumping structure for table testdrive.tbl_user
CREATE TABLE IF NOT EXISTS `tbl_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(128) CHARACTER SET latin1 NOT NULL,
  `password` varchar(128) CHARACTER SET latin1 NOT NULL,
  `email` varchar(128) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

# Dumping data for table testdrive.tbl_user: 4 rows
/*!40000 ALTER TABLE `tbl_user` DISABLE KEYS */;
INSERT INTO `tbl_user` (`id`, `username`, `password`, `email`) VALUES
	(1, '1', '1', '1'),
	(2, '2', '3', '3333456'),
	(3, '2', '33', '33334'),
	(4, 'admin', '123456', 'admin@admin.com');
/*!40000 ALTER TABLE `tbl_user` ENABLE KEYS */;

 



/yii_dev/testwebap/protected/models/TblUser.php

<?php
class TblUser extends CActiveRecord
{
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}
	public function tableName()
	{
		return 'tbl_user';
	}
    public function relations ()
    {
        return array(
            /*关系名字*/       
            'profile' => array( 
                    /*关联方式*/
                    self::HAS_ONE, 
                     /*关系表的CActiveRecord类*/
                    'TblProfile', 
                     /*关系表的外键,即tbl_profile通过哪一个字段和tbl_user主键关联.*/
                    'owner_id',
                     /*select显示的列。用string:'regdate,nickname',或者数组array('regdate','nickname')*/
                    'select' => array('regdate','nickname'),
                    /*条件:where 子句 。要保证实例化使用使用对象访问是能够访问,否这将会报non-boject错误*/
                    'condition' => 'owner_id<=4',
                    /*order by 排序*/                     
                    'order' => 'owner_id DESC , nickname ASC',
                    /*where条件中追加 以AND 开头的条件子句。他会智能的判断是否该加AND。这样省去了你组合where条件。不会和'condition'选项冲突
                     WHERE (owner_id<=4) AND ( nickname!='abc') AND (`profile`.`owner_id`=:ypl0) ORDER BY owner_id DESC , nickname ASC
                     */
                    'on' => " nickname!='abc' ",
            ),
        );
    }
}


/yii_dev/testwebap/protected/models/TblProfile.

<?php
class TblProfile extends CActiveRecord
{
    public static function model ($className = __CLASS__)
    {
        return parent::model($className);
    }
    public function tableName ()
    {
        return 'tbl_profile';
    }
}



/yii_dev/testwebap/protected/modules/testmod/controllers/DefaultController.php

<?php
class DefaultController extends Controller
{
    public function actionIndex ()
    {
        $this->render('index');
    }
    public function actionIndex2 ()
    {
        $user = TblUser::model()->findByPk(2);
        var_dump( '\nusername:' . $user->username . 'nickname:' . $user->profile->nickname);
        
        //or
        $userModel = new TblUser();
        $user = $userModel->findByPk(2);
        var_dump( '\nusername:' . $user->username . 'nickname:' . $user->profile->nickname);
        
        $users = TblUser::model()->findAll();
        foreach ($users as $user) {
            var_dump( '\nid:' . $user->id . 'username:' . $user->username . 'nickname:' . $user->profile->nickname);
        }        
        $users = TblUser::model()->findAll();
        exit();
    }
}






访问方法是

http://www.localyii.com/testwebap/index.php/testmod/default/index2


大体输出内容如下:

string(22) "\nusername:2nickname:2"
string(22) "\nusername:2nickname:2"
string(26) "\nid:1username:1nickname:1"
string(26) "\nid:2username:2nickname:2"
string(26) "\nid:3username:2nickname:3"
string(30) "\nid:4username:adminnickname:3"




上面举例是一对一的情况,如果是多对多,复杂的sql,建议你还是自定义DAO操作,这样无论是开发还是效率上,你都可以很容易的把握。用YII可能就过于繁琐了。

                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值