程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> Yii框架關聯查詢with用法分析

Yii框架關聯查詢with用法分析

編輯:PHP綜合

本文實例分析了Yii框架關聯查詢with用法。分享給大家供大家參考。具體方法如下:

Yii框架關聯查詢與mysql中的關聯查詢會有什麼區別呢?這裡小編就與各位來一起來看看吧。

Yii的關聯查詢確實是一個方便的東西,網上的資料也很多,但是大部分都是Ctrl+c,Ctrl+v,有些東西一直沒有人出來詳細的寫篇文章說明一下,在參考了網上很多資源以後,加上自己的的一些理解,寫下了這篇文章,給廣大初學者朋友們提供一點個人見解。

YII 支持四種類型的關系:

BELONGS_TO(屬於): 如果表 A 和 B 之間的關系是一對多,則 表 B 屬於 表 A (例如 Post 屬於 User);
HAS_MANY(有多個): 如果表 A 和 B 之間的關系是一對多,則 A 有多個 B (例如 User 有多個 Post);
HAS_ONE(有一個): 這是 HAS_MANY 的一個特例,A 最多有一個 B (例如 User 最多有一個 Profile);
MANY_MANY: 這個對應於數據庫中的 多對多 關系。 由於多數 DBMS 不直接支持 多對多 關系,因此需要有一個關聯表將 多對多 關系分割為 一對多 關系。
 
菜鳥們看到這個真的能明白嗎?

初學的時候,個人表示頭暈至極,經過反復的測試,我給大家非常直白的解釋一下。
現有用戶表user和博客表blog,博客是屬於某個用戶的,而用戶會發表多篇博客。
BELONGS_TO:
controller
復制代碼 代碼如下:$blogs = $blog_model->with('b_user')->find();
model 這裡的model指的是blog_model
復制代碼 代碼如下:'b_user'=>array(self::BELONGS_TO, 'user', 'author')
適用范圍,查找博客的時候需要把博客的作者也查出來。
b_user中第二個參數:子表的表名,第三個參數,主表中用於存子表主鍵的字段(blog表中用於存user表主鍵的字段)。
 
HAS_ONE:
controller
復制代碼 代碼如下:$user_blog = $user_model->with('u_blog')->find();
model 這裡的的model指的是user_model
復制代碼 代碼如下:'u_blog'=>array(self::HAS_ONE, 'blog', 'author')
測試一下,不僅僅查出了作者的信息,而且還查出了一篇該作者的博客。
u_blog中的第二個參數:子表表名,第三個參數,子表中用於存主表主鍵的字段(blog表中用於存user表主鍵的字段)。
 
HAS_MANY:
controller
復制代碼 代碼如下:$user_blogs = $user_model->with('u_blogs')->find();
model 這裡的的model指的是user_model
復制代碼 代碼如下:'u_blogs'=>array(self::HAS_MANY, 'blog', 'author')
測試一下,不僅僅查出了作者的信息,也不僅僅查出了一篇該作者的博客,而且還查出了該作者其它的博客。
u_blogs中的第二個參數:子表表名,第三個參數,子表中用於存主表主鍵的字段(blog表中用於存user表主鍵的字段)。
 
MANY_TO_MANY:
這個東西啊,我還沒用過,貌似基本上也不會用到,待我測一下,再來續上。。。
 
至此,Yii with的最最基本用法說的差不多了,但是你就沒有啥疑問嗎?
如何指定要查詢的子表字段?
HAS_MANY中查出了該用戶的所有文章,如果我只想要查5篇呢?
……等你來提問。
那麼,廢話不多說,解決第一個問題
復制代碼 代碼如下:'u_blogs'=>array(self::HAS_MANY, 'blog', 'author','select'=>'gid,title,content')
這樣試試?
第二個問題
復制代碼 代碼如下:'u_blogs'=>array(self::HAS_MANY, 'blog', 'author','select'=>'gid,title,content','condition'=>'u_blogs.gid=2')
搞定!
 
相信看過這些非常小白的講解後應該恍然大悟了吧。此所謂萬事開頭難啊,剩下的東西相信你一看就懂了~~~
 
以下內容來自Yii手冊:
 
延遲加載時有一定的關系,下列選項可用:
'group': string, GROUP BY子句。 默認值為空。 注意,列引用需要加入'relationName'前綴 。(例如: relationName.age)。此選項僅適用於HAS_MANY 和 MANY_MANY 關系。
'having': string, HAVING子句。 默認值為空。 注意,列引用需要加入'relationName'前綴 。(例如: relationName.age)。此選項僅適用於HAS_MANY 和 MANY_MANY 關系。
'limit': 數據行的limit選擇。 這個選項不能應用到BELONGS_TO。
'offset': 數據行的偏移量。 這個選項不能應用到BELONGS_TO。
'through': 獲取相關的數據時將用作橋的模型的關系的名稱。可以設置僅為 HAS_ONE 和 HAS_MANY。此選項自版本 1.1.7 可用。

以下是一個例子,為 'Post' 活動記錄類相關對象的一個示例:
復制代碼 代碼如下:return array(
    'author'=>array(self::BELONGS_TO, 'User', 'author_id'),
    'comments'=>array(self::HAS_MANY, 'Comment', 'post_id', 'with'=>'author', 'order'=>'create_time DESC'),
    'tags'=>array(self::MANY_MANY, 'Tag', 'post_tag(post_id, tag_id)', 'order'=>'name'),
);

希望本文所述對大家的yii框架程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved