關於thinkphp關聯模型的HAS ONE

2021-06-22 07:13:11 字數 1955 閱讀 8921

距離第一次學習thinkphp有一年多了,也算是認識它和使用它一年多了吧,但是發現我對thinkphp還是有些不熟悉的地方,特別是模型。

最近開發二手房專案,裡面用到模型,然後資料庫是沿用之前的,框架轉為thinkphp,之前一直自己設計資料庫,所以模型可以做的和官方一樣,但是這次因為資料庫不便於改動,所以用has_one的時候,發現問題了。

我用的是3.1.3版本,

官方手冊給出的has_one模型支援的關聯屬性是這樣的:

關聯型別,這個在has_one 關聯裡面必須使用has_one 常量定義。

class_name要關聯的模型類名

例如,class_name 定義為profile的話則表示和另外的profile模型類關聯,這個profile模型類是無需定義的,系統會自動定位到相關的資料表進行關聯。

foreign_key關聯的外來鍵名稱

外來鍵的預設規則是當前資料物件名稱_id,例如:

usermodel對應的可能是表think_user (注意:think只是乙個表字首,可以隨意配置)

那麼think_user表的外來鍵預設為 user_id,如果不是,就必須在定義關聯的時候顯式定義 foreign_key 。

condition關聯條件

關聯查詢的時候會自動帶上外來鍵的值,如果有額外的查詢條件,可以通過定義關聯的condition屬性。

as_fields直接把關聯的字段值對映成資料物件中的某個字段

這個特性是one_to_one 關聯特有的,可以直接把關聯資料對映到資料物件中,而不是作為乙個關聯資料。當關聯資料的欄位名和當前資料物件的欄位名稱有衝突時,還可以使用對映定義。

我現在需要關聯兩種表:

community(小區表)和region(地區表)

小區表裡的字段region和地區表裡的rid是關聯的

小區表

地區表

按照官方文件,寫出來的模型是這樣的

<?php 

class communitymodel extends relationmodel

然後action那邊是

$id = $_get['cid'];

$community = d('community');

$where['cid'] = $id;

$list = $community->relation('region')->where($where)->select();

列印出來的結果是

array(1)                                 

break;

關鍵是151行

這裡就是關聯的條件了,平時我們left join table on  a=b

第135行-145行**中有

// 自引用關聯 獲取父鍵名

}else

144行

下面是查詢$pk經過

151行$pk

下面是解決方案

<?php 

class communitymodel extends relationmodel

其實就是加了

這樣就可以了,tp手冊中沒告訴我們,可能是因為怕我們使用的時候沒加索引,影響效率吧,

還有,一般我是has_many的時候才用tp的關聯模型,因為has_one還不如直接left join效率高,下回再分析,如有不對,希望大家指正。

關於thinkphp關聯模型的效率問題

以前聽說過thinkphp關聯模型效率比較低,但是一直沒去看源 現在也沒看 今天寫rbac的時候才感覺到 user表,字段 id,nickname role表,字段 id,remark role user表,user id,role id 將所有使用者列出來,並顯示其所在使用者組 一 使用think...

ThinkPHP關聯模型詳解

在thinkphp中,關聯模型更類似一種mysql中的外來鍵約束,但是外來鍵約束更加安全,缺點卻是在寫sql語句的時候不方便,thinkphp很好得解決了這個問題.但是很多人不動關聯模型的意思.現在就寫個例子.讓大家理解thinkphp關聯模型的意思.環境描述 公司有乙個員工表think user,...

ThinkPHP關聯模型詳解

在thinkphp中,關聯模型更類似一種mysql中的外來鍵約束,但是外來鍵約束更加安全,缺點卻是在寫sql語句的時候不方便,thinkphp很好得解決了這個問題.但是很多人不動關聯模型的意思.現在就寫個例子.讓大家理解thinkphp關聯模型的意思.環境描述 公司有乙個員工表think user,...