yii模型中关系(relations)中非主键关联的解决方案

显示A表的记录,该表与B表如果通过主键关联,一对一的关系如下:

/**
 * @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(
		'myauthitem'=>array(self::HAS_ONE,'AuthItem','userid'),
	);
}

其中userid是AuthItem模型所对应表中的关联字段。YII默认是用主表的主键与该字段(userid)关联。可打开CWebLogRoute看一下,摘要如下:

Querying SQL: SELECT `t`.`id` AS `t0_c0`, `t`.`username` AS `t0_c1`,
`t`.`password` AS `t0_c2`, `t`.`role` AS `t0_c3`, `t`.`description` AS
`t0_c4`, `t`.`last_login_time` AS `t0_c5`, `t`.`last_login_ip` AS `t0_c6`,
`myauthitem`.`name` AS `t1_c0`, `myauthitem`.`type` AS `t1_c1`,
`myauthitem`.`description` AS `t1_c2`, `myauthitem`.`bizrule` AS `t1_c3`,
`myauthitem`.`data` AS `t1_c4` FROM `kj_manager` `t`  LEFT OUTER JOIN
`kj_authitem` `myauthitem` ON (`myauthitem`.`userid`=`t`.`id`)  LIMIT 10

但是,如果A表的非主键如何解决这个问题。

比如管理员表,字段为id,name,password,role,time....,role字段为“角色”属性,关联Authitem表的name字段,显示description信息。

可通过以下方案解决:

/**
 * @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(
		'myauthitem'=>array(self::HAS_ONE,'AuthItem','','on'=>'t.role=myauthitem.name'),
	);
}
‘on’: the ON clause. The condition specified here will be appended to the joining condition using the AND operator.

on子句,通过 and 操作符附加到join条件之后。

因此,relations关系中,如果没有主键关联,则第三个参数必须设置为空。

查看一下生成的SQL:

Querying SQL: SELECT `t`.`id` AS `t0_c0`, `t`.`username` AS `t0_c1`,
`t`.`password` AS `t0_c2`, `t`.`role` AS `t0_c3`, `t`.`description` AS
`t0_c4`, `t`.`last_login_time` AS `t0_c5`, `t`.`last_login_ip` AS `t0_c6`,
`myauthitem`.`name` AS `t1_c0`, `myauthitem`.`type` AS `t1_c1`,
`myauthitem`.`description` AS `t1_c2`, `myauthitem`.`bizrule` AS `t1_c3`,
`myauthitem`.`data` AS `t1_c4` FROM `kj_manager` `t`  LEFT OUTER JOIN
`kj_authitem` `myauthitem` ON (t.role=myauthitem.name)  LIMIT 10

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值