FleaPHP 開發指南 - 7. 資料表關聯

來源:互聯網
上載者:User
開發指南|資料

資料表關聯是指兩個或者多個資料表的記錄之間的邏輯關係。

例如:

  • 每一個公民都有一個社會安全號碼碼
  • 每一位作者都寫了多本(0-n)書籍,而每一本書籍都有多個(1-n)作者
  • 每一篇文章都有多個(0-n)評論
  • 每一個評論都屬於一篇文章

目前,FleaPHP 支援四種類型的資料表關聯,分別是:

  • HAS_ONE: 當前表的每一條記錄都擁有最多一條(0–1)關聯記錄
  • HAS_MANY: 當前表的每一條記錄都擁有多條(0-n)關聯記錄
  • MANY_TO_MANY: 當前表的每一條記錄都和其他表的多條(0-n)記錄關聯
  • BELONGS_TO: 當前表的每一條記錄都屬於另一個表的某條記錄

在 FleaPHP 中,可以為每一個表資料入口定義多個不同的關聯,例如:

<?phpload_class('FLEA_Db_TableDataGateway');class Model_ProductClass extends FLEA_Db_TableDataGateway{    var $tableName = 'product_class';    var $primaryKey = 'pclass_id';    var $hasMany = array(        array(            'tableClass' => 'Model_Permissions',            'foreignKey' => 'pclass_id',            'mappingName' => 'permissions',        ),        array(            'tableClass' => 'Model_Products',            'foreignKey' => 'pclass_id',            'mappingName' => 'products',            'enabled' => false,        ),    );    var $hasOne = array(        array(            'tableClass' => 'Model_ProductClassAdverts',            'foreignKey' => 'pclass_id',            'mappingName' => 'advert',        )    );}?>

術語

在詳細介紹這四種關聯之前,先瞭解一些後文將會用到的術語。

  • 關聯: 一個關聯是一個關係,這個關係屬於某一個資料表。例如 users 表可能就擁有一個或者多個關聯。
  • 主表: 對於一個關聯,擁有該關聯的資料表就是主表。例如 posts 表定義了一個 MANY_TO_MANY 關聯。那麼在這裡(指這個關聯),posts 就是主表。
  • 關聯表: 在一個關聯中,關聯表就是除主表外的另一個表。
  • 外鍵: 在資料庫原理中,外鍵的含義很複雜。但在 FleaPHP 架構中的資料庫關聯功能中,外鍵泛指一個記錄中用於關聯另一個記錄的欄位。例如 profile 表中的 user_id 欄位就是用於關聯 users 表的欄位。這個 user_id 欄位就是一個外鍵。
  • 中間表: 在 MANY_TO_MANY 關聯中,除了主表和關聯表,還需要另一個表來儲存這兩個表的記錄之間的互相關聯關係。這個表稱為中間表。

理解這幾個術語後,我們再來看每一種關聯的詳細解釋。


HAS_ONE 一對一關聯

HAS_ONE 是一種非常簡單的關聯關係。表示一個記錄擁有另一個記錄。這兩個記錄分別位於兩個資料表中。

樣本

在一個資訊管理系統中,users 表用於儲存使用者帳戶的基本資料,例如使用者名稱、密碼等。而 profiles 表則用於儲存使用者的個人資訊,例如家庭住址、郵遞區號等。

由於每一個使用者(一條 users 表中的記錄)都有一份對應的個人資訊(一條 profiles 表中的記錄)。因此,我們就可以為 users 表定義一個 HAS_ONE 關聯。

很明顯,users 表的記錄擁有一條 profiles 表的記錄。因此,當 users 表中的一條記錄被刪除時,被刪除記錄所擁有的 profiles 表中的關聯記錄也會被自動刪除。

表定義

在 HAS_ONE 關聯中,要求外鍵放置在關聯表中。

上述例子的表定義簡化版如下:

users 表:

  • user_id 主鍵欄位
  • username

profiles 表:

  • profile_id 主鍵欄位
  • address
  • postcode
  • user_id 外鍵欄位

對應的 MySQL 代碼如下:

CREATE TABLE `users` (    `user_id` INT NOT NULL AUTO_INCREMENT ,    `username` VARCHAR( 32 ) NOT NULL ,    PRIMARY KEY ( `user_id` ));CREATE TABLE `profiles` (    `profile_id` INT NOT NULL AUTO_INCREMENT ,    `address` VARCHAR( 128 ) NOT NULL ,    `postcode` VARCHAR( 8 ) NOT NULL ,    `user_id` INT NOT NULL ,    PRIMARY KEY ( `profile_id` ));

對應的 FLEA_Db_TableDataGateway 繼承類的定義如下:

<?phpload_class('FLEA_Db_TableDataGateway');class Users extends FLEA_Db_TableDataGateway{    var $tableName = 'users';    var $primaryKey = 'user_id';    var $hasOne = array(        'tableClass' => 'Profiles',        'foreignKey' => 'user_id',        'mappingName' => 'profile',    );}class Profiles extends FLEA_Db_TableDataGateway{    var $tableName = 'profiles';    var $primaryKey = 'profile_id';}?>

示範代碼

<?php// 首先插入一條 users 記錄$modelUsers =& new Users();$newUserId = $modelUsers->create(    array('username' => 'dualface'));// 接下來,再插入一條 profiles 記錄$modelProfiles =& new Profiles();$modelProfiles->create(    array(        'address' => 'SiChuan ZiGong',        'postcode' => '643000',        'user_id' => $newUserId    ));// OK,我們現在嘗試讀取一條 users 記錄,看看會得到什麼結果$user = $modelUsers->find($newUserId);dump($user);?>

結果很有趣,多出來的 ‘profile’ 欄位正好是我們剛剛插入 profiles 表的記錄內容:

Array(    [user_id] => 1    [username] => dualface    [ref___id] => 1    [profile] => Array        (            [profile_id] => 1            [address] => SiChuan ZiGong            [postcode] => 643000            [user_id] => 1            [ref___id] => 1        ))

說明

在上面的例子中,Users 類中有一個 $hasOne 成員變數。該變數為一個數組:

var $hasOne = array(    'tableClass' => 'Profiles',    'foreignKey' => 'user_id',    'mappingName' => 'profile',);

$hasOne 成員變數用於為一個表資料庫入口指定 HAS_ONE 關聯。

在關聯的定義中,tableClass 指定關聯表的表資料入口類名稱,foreignKey 指定外鍵欄位名,而 mappingName 則指定在主表的查詢結果中用什麼欄位對應關聯表的資料。






相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。