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( " username:" . $user->username . "nickname:" . $user->profile->nickname); //or $userModel = new TblUser(); $user = $userModel->findByPk(2); var_dump( " username:" . $user->username . "nickname:" . $user->profile->nickname); $users = TblUser::model()->findAll(); foreach ($users as $user) { var_dump( " id:" . $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) " username:2nickname:2" string(22) " username:2nickname:2" string(26) " id:1username:1nickname:1" string(26) " id:2username:2nickname:2" string(26) " id:3username:2nickname:3" string(30) " id:4username:adminnickname:3"
上面举例是一对一的情况,如果是多对多,复杂的sql,建议你还是自定义DAO操作,这样无论是开发还是效率上,你都可以很容易的把握。用YII可能就过于繁琐了。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。