欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP Yii2框架的關聯(lián)模型使用介紹

 更新時間:2022年09月02日 14:59:26   作者:PeakXin  
本文對 YII2.0的多表關聯(lián)查詢做一個簡單的介紹。文中通過實例代碼介紹的非常詳細,下面話不多說,來一起看看詳細的介紹

Active Record 可以將相關數(shù)據(jù)集中進來, 使其可以通過原始數(shù)據(jù)輕松訪問。 例如,客戶數(shù)據(jù)與訂單數(shù)據(jù)相關 因為一個客戶可能已經(jīng)存放了一個或多個訂單。這種關系通過適當?shù)穆暶鳎?你可以使用 $customer->orders 表達式訪問客戶的訂單信息 這表達式將返回包含 Order Active Record 實例的客戶訂單信息的數(shù)組。

聲明關聯(lián)關系

你必須先在 Active Record 類中定義關聯(lián)關系,才能使用 Active Record 的關聯(lián)數(shù)據(jù)。 簡單地為每個需要定義關聯(liá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 類聲明了一個 orders 關聯(lián), 和為 Order 聲明了一個 customer 關聯(lián)。

每個關聯(lián)方法必須這樣命名:getXyz。然后我們通過 xyz(首字母小寫)調用這個關聯(lián)名。 請注意關聯(lián)名是大小寫敏感的。

當聲明一個關聯(lián)關系的時候,必須指定好以下的信息:

  • 關聯(lián)的對應關系:通過調用 hasMany() 或者 hasOne() 指定。在上面的例子中,您可以很容易看出這樣的關聯(lián)聲明: 一個客戶可以有很多訂單,而每個訂單只有一個客戶。
  • 相關聯(lián) Active Record 類名:用來指定為 hasMany() 或者 hasOne() 方法的第一個參數(shù)。 推薦的做法是調用 Xyz::className() 來獲取類名稱的字符串,以便您 可以使用 IDE 的自動補全,以及讓編譯階段的錯誤檢測生效。
  • 兩組數(shù)據(jù)的關聯(lián)列:用以指定兩組數(shù)據(jù)相關的列(hasOne()/hasMany() 的第二個參數(shù))。 數(shù)組的值填的是主數(shù)據(jù)的列(當前要聲明關聯(lián)的 Active Record 類為主數(shù)據(jù)), 而數(shù)組的鍵要填的是相關數(shù)據(jù)的列。

一個簡單的口訣,先附表的主鍵,后主表的主鍵。 正如上面的例子,customer_idOrder 的屬性,而 idCustomer 的屬性。 (譯者注:hasMany() 的第二個參數(shù),這個數(shù)組鍵值順序不要弄反了)

訪問關聯(lián)數(shù)據(jù)

定義了關聯(lián)關系后,你就可以通過關聯(lián)名訪問相應的關聯(lián)數(shù)據(jù)了。就像 訪問一個由關聯(lián)方法定義的對象一樣,具體概念請查看 屬性。 因此,現(xià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;

提示: 當你通過 getter 方法 getXyz() 聲明了一個叫 xyz 的關聯(lián)屬性,你就可以像 屬性 那樣訪問 xyz。注意這個命名是區(qū)分大小寫的。

如果使用 hasMany() 聲明關聯(lián)關系,則訪問此關聯(lián)屬性 將返回相關的 Active Record 實例的數(shù)組; 如果使用 hasOne() 聲明關聯(lián)關系,訪問此關聯(lián)屬性 將返回相關的 Active Record 實例,如果沒有找到相關數(shù)據(jù)的話,則返回 null

當你第一次訪問關聯(lián)屬性時,將執(zhí)行 SQL 語句獲取數(shù)據(jù),如 上面的例子所示。如果再次訪問相同的屬性,將返回先前的結果,而不會重新執(zhí)行 SQL 語句。要強制重新執(zhí)行 SQL 語句,你應該先 unset 這個關聯(lián)屬性, 如:unset($ customer-> orders)。

$customer->orders; // 獲得 `Order` 對象的數(shù)組
$customer->getOrders(); // 返回 ActiveQuery 類的實例

設置別名

class Order extends ActiveRecord
{
    // ...
    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['id' => 'customer_id'])->alias('c');
    }
}

關聯(lián)查詢

$order = Order::find()->joinWith('customer')
            ->where(['filter1'=>$filter1, 'filter2'=>$filter2])
            ->andWhere(['=', 'c.filter3', $filter3])
            ->andWhere(['<=', 'cfilter4', $filter4])
            ->one();

到此這篇關于PHP Yii2框架的關聯(lián)模型使用介紹的文章就介紹到這了,更多相關PHP Yii2 關聯(lián)模型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論