yii下表关联实例教程

jerry Yii 2015年09月16日 收藏

 实例以bagecms为例

文章表

01.
CREATE TABLE `aps_post` (
02.
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
03.
`user_id` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '用户',
04.
`nickname` varchar(30) NOT NULL DEFAULT '' COMMENT '用户名',
05.
`author` varchar(100) NOT NULL DEFAULT '' COMMENT '作者',
06.
`title` varchar(255) NOT NULL COMMENT '标题',
07.
`title_second` varchar(255) NOT NULL DEFAULT '' COMMENT '副标题',
08.
`title_alias` char(50) NOT NULL DEFAULT '' COMMENT '别名 ',
09.
`title_style` varchar(255) NOT NULL DEFAULT '' COMMENT '标题样式',
10.
`title_style_serialize` varchar(255) NOT NULL DEFAULT '' COMMENT '标题样式序列化',
11.
`html_path` varchar(100) NOT NULL DEFAULT '' COMMENT 'html路径',
12.
`html_file` varchar(100) NOT NULL DEFAULT '' COMMENT 'html文件名',
13.
`template` varchar(60) NOT NULL DEFAULT '' COMMENT '模板',
14.
`catalog_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '分类',
15.
`catalog_fid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '所属副栏目',
16.
`special_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '专题编号',
17.
`intro` text COMMENT '摘要',
18.
`image_list` text COMMENT '组图',
19.
`seo_title` varchar(255) NOT NULL DEFAULT '' COMMENT 'SEO标题',
20.
`seo_description` text COMMENT 'SEO描述',
21.
`seo_keywords` varchar(255) NOT NULL DEFAULT '' COMMENT 'SEO关键字',
22.
`content` mediumtext NOT NULL COMMENT '内容',
23.
`copy_from` varchar(100) NOT NULL DEFAULT '' COMMENT '来源',
24.
`copy_url` varchar(255) NOT NULL DEFAULT '' COMMENT '来源url',
25.
`redirect_url` varchar(255) NOT NULL DEFAULT '' COMMENT '跳转URL',
26.
`tags` varchar(255) NOT NULL DEFAULT '' COMMENT 'tags',
27.
`view_count` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '查看次数',
28.
`commend` enum('Y','N') NOT NULL DEFAULT 'N' COMMENT '推荐',
29.
`attach_status` enum('Y','N') NOT NULL DEFAULT 'N' COMMENT '是否上传附件',
30.
`attach_file` varchar(255) NOT NULL DEFAULT '' COMMENT '附件名称',
31.
`attach_thumb` varchar(255) NOT NULL DEFAULT '' COMMENT '附件缩略图',
32.
`favorite_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '收藏数量',
33.
`attention_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '关注次数',
34.
`top_line` enum('Y','N') NOT NULL DEFAULT 'N' COMMENT '头条',
35.
`last_update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后更新时间',
36.
`reply_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '回复次数',
37.
`reply_allow` enum('Y','N') NOT NULL DEFAULT 'Y' COMMENT '允许评论',
38.
`sort_desc` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
39.
`acl` varchar(100) NOT NULL DEFAULT 'Y' COMMENT '权限检测',
40.
`status_is` enum('Y','N') NOT NULL DEFAULT 'Y' COMMENT '新闻状态',
41.
`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '录入时间',
42.
PRIMARY KEY (`id`)
43.
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='内容管理'


栏目表

01.
CREATE TABLE `aps_catalog` (
02.
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
03.
`parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '上级分类',
04.
`catalog_name` varchar(100) NOT NULL COMMENT '名称',
05.
`catalog_name_second` varchar(100) DEFAULT '' COMMENT '副名称',
06.
`catalog_name_alias` varchar(100) NOT NULL DEFAULT '' COMMENT '别名',
07.
`content` text COMMENT '详细介绍',
08.
`seo_title` varchar(100) NOT NULL DEFAULT '' COMMENT 'seo标题',
09.
`seo_keywords` varchar(255) NOT NULL DEFAULT '' COMMENT 'seo关键字',
10.
`seo_description` text COMMENT 'seo描述',
11.
`attach_file` varchar(100) DEFAULT '' COMMENT '附件',
12.
`attach_thumb` varchar(100) DEFAULT '' COMMENT '缩略图',
13.
`sort_order` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
14.
`data_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '数据量',
15.
`page_size` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '每页显示数量',
16.
`status_is` enum('Y','N') NOT NULL DEFAULT 'Y' COMMENT '状态',
17.
`menu_is` enum('Y','N') DEFAULT 'N' COMMENT '是否导航显示',
18.
`redirect_url` varchar(255) NOT NULL DEFAULT '' COMMENT '跳转地址',
19.
`display_type` enum('page','list') NOT NULL DEFAULT 'list' COMMENT '显示方式',
20.
`template_list` varchar(100) NOT NULL DEFAULT '' COMMENT '列表模板',
21.
`template_page` varchar(100) NOT NULL DEFAULT '' COMMENT '单页模板',
22.
`template_show` varchar(100) NOT NULL DEFAULT '' COMMENT '内容页模板',
23.
`acl_browser` varchar(255) NOT NULL DEFAULT '' COMMENT '浏览权限',
24.
`acl_operate` varchar(255) NOT NULL DEFAULT '' COMMENT '操作权限',
25.
`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '录入时间',
26.
PRIMARY KEY (`id`)
27.
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='全局分类'
//模型 models/post.php
1.
return array(            
2.
'catalog'=>array(self::BELONGS_TO, 'Catalog', 'catalog_id', 'alias'=>'catalog', 'select'=>'id,catalog_name'),        
3.
);


说明一下:

VarName: 是自定义的关系的名字
RelationType 指定关系类型,可以是一下四个常量之一: self::BELONGS_TO,self::HAS_ONE, self::HAS_MANY and self::MANY_MANY;
ClassName 是此 AR 类所关联的 AR 类的名字;
ForeignKey 指定关系中使用的外键(一个或多个)
额外的选项可以在每个关系的最后指定
//控制器下关联查询输出


1.
$bagecmssearchList = Post::model()->findByPk(2);
2.
var_dump($bagecmssearchList->catalog->catalog_name);
string(12) "网站建设"
1.
$bagecmssearchList = Post::model()->findAll();
2.
foreach ($bagecmssearchList as $v){
3.
var_dump($v->title.' -- '.$v->catalog->catalog_name);
4.
}



string(31) "爱磐石,你好! -- 随笔"
string(72) "Yii 1.0数据库操作 查询、增加、更新、删除 -- 网站建设"
string(35) "yii下的事务处理 -- lnmp博文"
string(31) "赤裸的懿德 -- 珍藏段子"


继续我们的yii关联,先前“港”的都是群殴模式的多对一关联。此时此刻我们一块整整hero模式的一对多关联 用户表和文章表还是前面的,这边不再罗嗦了

<----admin模型----->

1.
public function relations()
2.
{
3.
return array(
4.
'adminGroup'=>array(self::BELONGS_TO, 'AdminGroup', 'id', 'foreignKey'=>'group_id', 'alias'=>'group', 'select'=>'id,group_name'),
5.
'post'=>array(self::HAS_MANY,'Post','id','foreignKey'=>'user_id', 'select'=>'id,title,view_count'),   
6.
);
7.
}



<----控制器输出----->

1.
$admin = Admin::model()->findByPk(1);
2.
//$posts = $admin->post; //没有查询条件
3.
$posts = $admin->post(array('condition'=>'view_count > 100'));
4.
foreach ($posts as $p){
5.
var_dump($p->id.'--'.$p->title);
6.
}



打印输出结果:
string(24) "1--爱磐石,你好!"
string(59) "2--Yii 1.0数据库操作 查询、增加、更新、删除"
string(18) "3--赤裸的懿德"

<----控制器输出----->

01.
$data = Admin::model()->with(array(
02.
'post'=>array('condition'=>'view_count > 100')
03.
))->findAll();
04.
 
05.
$newArray = array();
06.
foreach ($data as $v){
07.
var_dump($v->username);
08.
foreach ($v->post as $p){
09.
echo '     ---'.$p->title.'('.$p->view_count.')
10.
';
11.
}
12.
}



打印输出结果:
string(4) "jack"
     ---爱磐石,你好!(120)
     ---Yii 1.0数据库操作 查询、增加、更新、删除(130)
     ---赤裸的懿德(111)

sql日志如下:

01.
system.db.CDbCommand.query(SHOW FULL COLUMNS FROM `aps_admin`) 
02.
system.db.CDbCommand.query(SHOW FULL COLUMNS FROM `aps_post`)  
03.
system.db.CDbCommand.query(SHOW CREATE TABLE `aps_admin`)  
04.
system.db.CDbCommand.query(SHOW CREATE TABLE `aps_post`)   
05.
system.db.CDbCommand.query(SELECT `t`.`id` AS `t0_c0`, `t`.`username` AS `t0_c1`, `t`.`password` AS `t0_c2`, `t`.`realname` AS `t0_c3`,
06.
`t`.`group_id` AS `t0_c4`, `t`.`email` AS `t0_c5`, `t`.`qq` AS `t0_c6`, `t`.`notebook` AS `t0_c7`, `t`.`mobile` AS `t0_c8`, `t`.`telephone` AS `t0_c9`,
07.
`t`.`last_login_ip` AS `t0_c10`, `t`.`last_login_time` AS `t0_c11`, `t`.`login_count` AS `t0_c12`, `t`.`status_is` AS `t0_c13`,
08.
`t`.`create_time` AS `t0_c14`, `post`.`id` AS `t1_c0`, `post`.`title` AS `t1_c4`, `post`.`view_count` AS `t1_c25`
09.
FROM `aps_admin` `t`
10.
LEFT OUTER JOIN `aps_post` `post`
11.
ON (`post`.`user_id`=`t`.`id`) WHERE (view_count > 100))


好了,先吃桶泡面。有问题讨论啊