距離第一次學習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)關鍵是151行break;
這裡就是關聯的條件了,平時我們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,...