yii之relations关联非主键

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,不去关联主键,而且关联其中一个字段的值,怎么搞都搞不定,论坛也翻了个遍,不得不说,yii的论坛搜索功能真的很烂,每次用都要从一堆的内容里过滤信息,还不见的能找到自己想要的,而且手册也比较简单,对这些东西没有做比较深入的解答。

后来无意中看到有个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‘),
);

再来个例子:http://www.jinyuanbao.cn/

有两张表,设计结构如下:

商品表:字段:p_id,member_id

商铺表:字段:shop_id,member_id

其中p_id,shop_id都是主键,member_id是索引

考虑过这个原因,是最初设计的时候,每一个普通用户都可以发布商品,所以商品表没有记录shop_id。

可能也会考虑过,每一个用户会有多个商铺吧,所以shop表的member_id也不是唯一索引。

然后,我用Yii在做表关联,事实上,在我们改动程序的时候,我们已经把普通用户能够发布商品这个功能去掉了,因此,事实上对我们来说member_id,其实肯定是于shop表中的member_id有对应关系。

于是我在ShopProduct的relations这样写
PHP代码

/**
* @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(
‘member‘ => array(self::BELONGS_TO,‘ShopMember‘,‘member_id‘,‘with‘=>‘extends‘,‘condition‘=>"member.member_state = ‘1‘"),
‘shop‘ => array(self::BELONGS_TO , ‘ShopInfo‘ , ‘member_id‘,‘on‘=>‘t.member_id = shop.member_id‘ ),
);
}

  

是的,看上去好象没问题,但是实际却关联不上。

在Yii的代码中,关于relation的on是这样写的:
XML/HTML代码

‘on‘: the ON clause. The condition specified here will be appended to the joining condition using the AND operator. This option has been available since version 1.0.2.

所以,上述的代码在SQL中显示出来就是 select * from product left outer join shop on (product.member_id = shop.shop_id and product.member_id = shop.member_id)//这个代码是伪代码,只是为了说明问题。

出现这种情况可以将foreignKey字段设为空,然后再指定ON。

PHP代码

/**
* @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(
‘member‘ => array(self::BELONGS_TO,‘ShopMember‘,‘member_id‘,‘with‘=>‘extends‘,‘condition‘=>"member.member_state = ‘1‘"),
‘shop‘ => array(self::BELONGS_TO , ‘ShopInfo‘ , ‘‘,‘on‘=>‘t.member_id = shop.member_id‘ ),
);
}
查找的时候必须使用‘with‘关键字,例如
Member::model()->with(‘shop‘)->findAll($criteria);

  

yii之relations关联非主键

时间: 2024-11-06 03:28:19

yii之relations关联非主键的相关文章

外键关联非主键id时-hbm.xml配置,及其分页查询DaoImpl

表关联时,外键关联非主键id时-hbm.xml配置: (由于hibernate默认为关联主键查询,故需要配置相关hql语句的属性) <many-to-one name="areas" class="com.hnqy.entity.Areas" fetch="select" property-ref="areaid" foreign-key="areaid"> <column name=&q

No row with the given identifier exists-----hiberbate非主键关联

这个错误有两种情况: 1,非主键关联为配置property-ref=(关联表的非主键列) 属性! Hibernate配置文件中关联默认的是主键关联,如果要关联非主键则必须加property-ref 属性 <many-to-one name="domainBO" class="***.common.model.bo.DomainBO" fetch="select" property-ref="domain">    

关于hibernate非主键多对一关联

一直以来,用hibernate做多对一时,关联的都是主键,今天,同事设计的表,关联的却不是主键,这下麻烦了,hibernate的many-to-one默认关联的都是主键,原来,hibernate提供了非主键的关联,即只要加一个property-ref即可,如: <many-to-one name="dept" class="Dept" property-ref="dept_no"> <column name="dept

mysql 用非主键where语句报错Error Code: 1175.You are using safe update mode and you tried …

1)这是因为MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令,执行命令SET SQL_SAFE_UPDATES = 0;修改数据库模式 执行完更新之后再将SET SQL_SAFE_UPDATES 恢复为 1; 2)或者还可以在条件后面加limit语句加以限制.

mysql非主键自增长

mysql并非只有主键才能自增长,而是设为键的列就可以设置自增长. 如下: 1 2 3 4 CREATE TABLE t1 (     id INT,     col1 INT auto_increment NOT NULL ); 结果如下: 如果把col1列设为键,就可以创建自增. 1 2 3 4 5 CREATE TABLE t1 (     id INT,     col1 INT auto_increment NOT NULL,     key(col1) ); 结果如下: 如果我们把i

mysql——非主键自增

今天遇到一个问题: 要创建一张表,其中我想将ip和date这两列作为一个复合主键,可以通过如下语句修改表结构: alter table tb_name add primary key (字段1,字段2,字段3); 但是这样做会报错,原因是我在最开始创建表的时候已经将id作为主键了,因此要先取消id的主键(取消之前要先将id的自增去掉,否则无法取消他的主键). 此时这张表已经将ip和date设置为复合主键,但我仍然想将ip设为主键,此时就会报错: emmm 大概意思就是只有key能设置自增,但是这

——请问数据库表关联用主键ID好还是CODE好

看需求了,不知道你们的code有什么含义,如果仅仅是数据的唯一标志,用id就行了,为什么还要另外code,如果code是可变的,那只能关联到code吧,如果是不可变的,关联code和id都可以. | 园豆:6408 (大侠五级) | 2020-02-14 11:34我现在是在一张表里有三个其它表CODE,这个code是要展示的,我如果用ID关联,就要每次去Join其它表是关联查CODE,如果直接放CODE,这个CODE又是能偶尔被改的.我期望每次查询不关联那三张表,又想改CODE的时候动作小一些

全查 外键查询 外键的非主键查询

大表百万条以上记录非主键索引删除大量数据的操作方法

众所周知,上百万表数据类似上述写法,哪怕where条件命中索引,执行时间也不会低于10分钟:考虑对数据的操作会引起两表的排他锁,造成业务被暂停!从服务器资源的影响:IOPS升高,IO争用造成CPU等待(高CPU):删除表存在的大量空间碎片,造成的空间浪费及性能低下 这种需求可以采用中间表rename方法,将要保留的数据写入中间表,写入完成后将原表删除,并将中间表改名为原始表: 具体操作步骤如下: 1.SHOW CREATE TABLE ooo_scrm_customer;   2.创建同ooo_