《PHP實戰:Yii2中hasOne、hasMany及多對多關聯查詢的用法詳解》要點:
本文介紹了PHP實戰:Yii2中hasOne、hasMany及多對多關聯查詢的用法詳解,希望對您有用。如果有疑問,可以聯系我們。
相關主題:YII框架
前言PHP教程
hasOne、hasMany是Yii2特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們.為什么?因為這種方式關聯查詢出來的結果會保留Yii2自有的表頭排序功能,以及CheckboxColumn中input的id存值,至于還有沒有其它的好處就需要大家去挖掘了,筆者目前就發現了這兩個常用的好處.其他的關聯查詢,像yiidbQuery查詢或者原生的SQL語句查詢都沒有,查詢出來在列表展示的時候,表頭一排黑.PHP教程
Yii2的hasOne、hasMany多表關聯查詢,不管是文檔還是文章其實都可以輕而易舉的找到參考母本,但是筆者為什么還要寫這篇文章呢,想法其實也很簡單,因為在前面的信息中我沒有看到多對多關聯查詢的用法,不重復別人,也重復自己,本文的重點就講多對多關聯查詢的用法,讓你漲漲知識.PHP教程
需求分析PHP教程
1、使用一條查詢語句就能把列表的數據全部展現出來,列表包含一對一,一對多,以及多對多的關系.PHP教程
2、不能破壞Yii2自有的表頭排序功能,以及CheckboxColumn中input的id存值.PHP教程
效果圖PHP教程
1、一對一,一對多,多對多,表頭排序.PHP教程
PHP教程
2、CheckboxColumn中input的id值.PHP教程
PHP教程
代碼分析PHP教程
多對多PHP教程
例子:一個客戶可以有多個標簽,一個標簽可以對多個客戶.PHP教程
1、在TSales(客戶表的 model)里加入如下代碼:PHP教程
public function getcommon_tag() { return $this->hasMany(CommonTag::className(), ['itemid' => 't_id'])->onCondition(['idtype' => "內容"])->joinWith(['tag']); }
注釋:這里common_tag表為中間表,common_tag中間表用hasMany與客戶表關聯之后要在后面加上joinWith(['tag'])關聯標簽表.onCondition為附加條件的方法.PHP教程
2、在CommonTag(中間表 model)里加入如下代碼關聯標簽表,用hasOne就行.PHP教程
public function gettag() { return $this->hasOne(Tag::className(), ['id'=>'tagid']); }
3、在TSalesSearch(客戶的Search model) 里加入如下代碼關聯common_tag中間表: $query->joinWith(['common_tag']);PHP教程
4、頁面輸出代碼如下:PHP教程
[ 'attribute' => 'tag_id', 'value' => function ($model) { $_tag=$model->getRelatedRecords()['common_tag']; if(!empty($_tag)){ $tagName=""; foreach ($_tag as $key => $value) { $tagName.=$value['tag']['name'].'/'; } return rtrim($tagName,'/'); } }, ],
注釋:$model->getRelatedRecords() 是用于獲取[_related:yiidbBaseActiveRecord:private]數組的值.PHP教程
一對多PHP教程
1、在前面的多對多用法中涉及到的hasMany就屬于一對多的用法,要實現一對多的話就把后面的joinWith去掉就可以了,其它配置以及輸出方式都一樣.PHP教程
一對一PHP教程
1、一對一的用法前面也涉及了,hasOne就屬于一對一的用法,配置和hasMany一樣,這里就不詳述了.PHP教程
注意事項PHP教程
1、當關聯查詢出來的值使用如下代碼輸出(common_tag.name)獲取不到值的時候,那就應該是你的客戶表存在這個name字段,并且這個值為空,重名了之后就會優先輸出主表的字段,解決辦法用:$model->getRelatedRecords()獲取.PHP教程
[ 'attribute' => 'tag_id', 'value' => 'common_tag.name' ]
以上所述是小編給大家介紹的Yii2中hasOne、hasMany及多對多關聯查詢的用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的.在此也非常感謝大家對維易PHP網站的支持!PHP教程
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/1799.html