php – 关系Yii ActiveRecord用于具有NULL值的复合键的表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 关系Yii ActiveRecord用于具有NULL值的复合键的表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2265字,纯文字阅读大概需要4分钟。
内容图文
![php – 关系Yii ActiveRecord用于具有NULL值的复合键的表](/upload/InfoBanner/zyjiaocheng/784/4a69b53c3c1945519c9d730f9f2f3006.jpg)
为了在某??些站点上存储用户定义的书签,我有一个包含复合键的表:
CREATE TABLE bookmarks (
user_id int not null,
book_id int not null,
page_id int,
...
);
CREATE UNIQUE INDEX ON bookmarks(user_id, book_id, page_id);
注意,page_id可以为NULL,而user_id和book_id则不能.当page_id为null时,为整本书设置书签,否则 – 为某个页面设置.
对应的ActiveRecord类定义了一些关系:
public function relations() {
return array(
"user" => array(self::BELONGS_TO, "User", "user_id"),
"book" => array(self::BELONGS_TO, "Book", "book_id"),
"page" => array(self::BELONGS_TO, "Page", "page_id"),
);
}
和一个primaryKey()方法::
public function primaryKey() {
return array("user_id", "book_id", "orig_id");
}
现在我想为一些用户获取整本书的所有书签.所以,我这样做:
$bookmarks = Bookmark::model()->findAll(array(
"condition" => "t.user_id = :user_id AND t.page_id IS NULL",
"params" => array(":user_id" => 1),
));
它运行良好,返回4条记录,但显然,我想使用书籍表中的一些相关数据:
$bookmarks = Bookmark::model()->findAll(array(
"with" => "book",
"condition" => "t.user_id = :user_id AND t.page_id IS NULL",
"params" => array(":user_id" => 1),
));
现在我得到0条记录(count($bookmarks)== 0),虽然生成的SQL语句选择了所有需要的数据,但它只是不被CActiveRecord类识别.另一个奇怪的是,当我尝试获取所有页面书签时,一切都很好:
$bookmarks = Bookmark::model()->findAll(array(
"with" => "book",
"condition" => "t.user_id = :user_id AND t.page_id IS NOT NULL",
"params" => array(":user_id" => 1),
));
我究竟做错了什么?如何在第二个例子中使表达式返回一些数据? PHP 5.4.0,Yii 1.1.8,PostgreSQL 9.1.4,外部32°C.
解决方法:
您的问题可以通过这种方式解决:
>将代理PK添加到书签表(例如自动增量序列).
>删除primaryKey()函数.
您也可以使用更方便的代码:
public function relations()
{
return array(
//...
'wholeBook' => array(self::BELONGS_TO, 'Book', 'book_id', 'on'=>"page_id IS NULL", 'joinType'=>'INNER JOIN'),
//...
);
}
然后在控制器中:
$bookmarks = Bookmark::model()->with('wholeBook')->findAllByAttributes(array('user_id'=>1));
事实上,使用UNIQUE键而不是PRIMARY和primaryKey(),您可以使用hack来避免在复合PK中使用NULL列的不可能性.
ActiveRecord是一种ORM,因此SQL中的任何逻辑都必须转换为AR(Yii自动加载DB模式),并且它必须是正确的逻辑.
如果我是你,我会将SQL标准化为以下内容:
因为这是两种不同类型的书签,具有不同的关系.您应该只在视图逻辑中加入它们,而不是在关系结构中.恕我直言
内容总结
以上是互联网集市为您收集整理的php – 关系Yii ActiveRecord用于具有NULL值的复合键的表全部内容,希望文章能够帮你解决php – 关系Yii ActiveRecord用于具有NULL值的复合键的表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。