PHP Yii2框架的關(guān)聯(lián)模型使用介紹
Active Record 可以將相關(guān)數(shù)據(jù)集中進(jìn)來, 使其可以通過原始數(shù)據(jù)輕松訪問。 例如,客戶數(shù)據(jù)與訂單數(shù)據(jù)相關(guān) 因?yàn)橐粋€(gè)客戶可能已經(jīng)存放了一個(gè)或多個(gè)訂單。這種關(guān)系通過適當(dāng)?shù)穆暶鳎?你可以使用 $customer->orders 表達(dá)式訪問客戶的訂單信息 這表達(dá)式將返回包含 Order Active Record 實(shí)例的客戶訂單信息的數(shù)組。
聲明關(guān)聯(lián)關(guān)系
你必須先在 Active Record 類中定義關(guān)聯(lián)關(guān)系,才能使用 Active Record 的關(guān)聯(lián)數(shù)據(jù)。 簡單地為每個(gè)需要定義關(guān)聯(lián)關(guān)系聲明一個(gè) 關(guān)聯(lián)方法 即可,如下所示,
class Customer extends ActiveRecord
{
// ...
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}
}
class Order extends ActiveRecord
{
// ...
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
}
}上述的代碼中,我們?yōu)?Customer 類聲明了一個(gè) orders 關(guān)聯(lián), 和為 Order 聲明了一個(gè) customer 關(guān)聯(lián)。
每個(gè)關(guān)聯(lián)方法必須這樣命名:getXyz。然后我們通過 xyz(首字母小寫)調(diào)用這個(gè)關(guān)聯(lián)名。 請注意關(guān)聯(lián)名是大小寫敏感的。
當(dāng)聲明一個(gè)關(guān)聯(lián)關(guān)系的時(shí)候,必須指定好以下的信息:
- 關(guān)聯(lián)的對(duì)應(yīng)關(guān)系:通過調(diào)用
hasMany()或者hasOne()指定。在上面的例子中,您可以很容易看出這樣的關(guān)聯(lián)聲明: 一個(gè)客戶可以有很多訂單,而每個(gè)訂單只有一個(gè)客戶。 - 相關(guān)聯(lián)
Active Record類名:用來指定為hasMany()或者hasOne()方法的第一個(gè)參數(shù)。 推薦的做法是調(diào)用Xyz::className()來獲取類名稱的字符串,以便您 可以使用 IDE 的自動(dòng)補(bǔ)全,以及讓編譯階段的錯(cuò)誤檢測生效。 - 兩組數(shù)據(jù)的關(guān)聯(lián)列:用以指定兩組數(shù)據(jù)相關(guān)的列(
hasOne()/hasMany()的第二個(gè)參數(shù))。 數(shù)組的值填的是主數(shù)據(jù)的列(當(dāng)前要聲明關(guān)聯(lián)的Active Record類為主數(shù)據(jù)), 而數(shù)組的鍵要填的是相關(guān)數(shù)據(jù)的列。
一個(gè)簡單的口訣,先附表的主鍵,后主表的主鍵。 正如上面的例子,customer_id 是 Order 的屬性,而 id是 Customer 的屬性。 (譯者注:hasMany() 的第二個(gè)參數(shù),這個(gè)數(shù)組鍵值順序不要弄反了)
訪問關(guān)聯(lián)數(shù)據(jù)
定義了關(guān)聯(lián)關(guān)系后,你就可以通過關(guān)聯(lián)名訪問相應(yīng)的關(guān)聯(lián)數(shù)據(jù)了。就像 訪問一個(gè)由關(guān)聯(lián)方法定義的對(duì)象一樣,具體概念請查看 屬性。 因此,現(xiàn)在我們可以稱它為 關(guān)聯(lián)屬性 了。
// SELECT * FROM `customer` WHERE `id` = 123 $customer = Customer::findOne(123); // SELECT * FROM `order` WHERE `customer_id` = 123 // $orders 是由 Order 類組成的數(shù)組 $orders = $customer->orders;
提示: 當(dāng)你通過 getter 方法 getXyz() 聲明了一個(gè)叫 xyz 的關(guān)聯(lián)屬性,你就可以像 屬性 那樣訪問 xyz。注意這個(gè)命名是區(qū)分大小寫的。
如果使用 hasMany() 聲明關(guān)聯(lián)關(guān)系,則訪問此關(guān)聯(lián)屬性 將返回相關(guān)的 Active Record 實(shí)例的數(shù)組; 如果使用 hasOne() 聲明關(guān)聯(lián)關(guān)系,訪問此關(guān)聯(lián)屬性 將返回相關(guān)的 Active Record 實(shí)例,如果沒有找到相關(guān)數(shù)據(jù)的話,則返回 null。
當(dāng)你第一次訪問關(guān)聯(lián)屬性時(shí),將執(zhí)行 SQL 語句獲取數(shù)據(jù),如 上面的例子所示。如果再次訪問相同的屬性,將返回先前的結(jié)果,而不會(huì)重新執(zhí)行 SQL 語句。要強(qiáng)制重新執(zhí)行 SQL 語句,你應(yīng)該先 unset 這個(gè)關(guān)聯(lián)屬性, 如:unset($ customer-> orders)。
$customer->orders; // 獲得 `Order` 對(duì)象的數(shù)組 $customer->getOrders(); // 返回 ActiveQuery 類的實(shí)例
設(shè)置別名
class Order extends ActiveRecord
{
// ...
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id'])->alias('c');
}
}關(guān)聯(lián)查詢
$order = Order::find()->joinWith('customer')
->where(['filter1'=>$filter1, 'filter2'=>$filter2])
->andWhere(['=', 'c.filter3', $filter3])
->andWhere(['<=', 'cfilter4', $filter4])
->one();到此這篇關(guān)于PHP Yii2框架的關(guān)聯(lián)模型使用介紹的文章就介紹到這了,更多相關(guān)PHP Yii2 關(guān)聯(lián)模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
phpMyAdmin鏈接MySql錯(cuò)誤 個(gè)人解決方案
phpMyAdmin 試圖連接到 MySQL 服務(wù)器,但服務(wù)器拒絕連接。您應(yīng)該檢查 config.inc.php 中的主機(jī)、用戶名和密碼,并且確定這些信息與 MySQL 服務(wù)器的管理員所給出的信息一致。2009-12-12
PHP將整數(shù)數(shù)字轉(zhuǎn)換為羅馬數(shù)字實(shí)例分享

