隨筆-31  評論-257  文章-0  trackbacks-0
                在關系數據庫應用中,都離不開表與表的關聯,表與表之間建立了關聯關系后就可以提供很多方便的操作了,比如我要查詢一個學生的信息,如果不建立學生與班級的關系的話,那么,只可以顯示出學生的基本信息,而學生是屬于某一個班級的,我現在想知道這個學生的信息與該學生所在的班級的信息,甚至是該學生的任課老師等信息,建立了學生表,與班級表,老師表之間的關系就方便好多了,用一個學生ID就可以查找出所有相關聯的數據。

          在FleaPHP中,支持以下四種關聯關系:
                   
                * HAS_ONE
                * HAS_MANY
                * MANY_TO_MANY
                * BELONGS_TO
                   
          分別對應FLEA_Db_TableDataGateway表中的 $hasOne,$hasMany,$manyToMany,$belongsTo 屬性

          我們下面就用 老師,學生,學生檔案,班級的例子說說這幾個關系。

          以下是SQL代碼:
           1 //學生表
           2 Create TABLE `testDB`.`student` (
           3   `stu_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
           4   `stu_name` VARCHAR(20NOT NULL,
           5   `stu_class_id` INTEGER UNSIGNED NOT NULL,
           6   PRIMARY KEY (`stu_id`)
           7 )
           8 
           9 //學生檔案表
          10 Create TABLE `testDB`.`stu_record` (
          11   `record_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
          12   `stu_id` INTEGER UNSIGNED NOT NULL,
          13   `family_add` VARCHAR(150NULL,
          14   `family_tel` VARCHAR(20NULL,
          15   PRIMARY KEY (`record_id`)
          16 )
          17 
          18 //教師表
          19 Create TABLE `testDB`.`teacher` (
          20   `teacher_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
          21   `teacher_name` VARCHAR(20NOT NULL,
          22   PRIMARY KEY (`teacher_id`)
          23 )
          24 
          25 //班級表
          26 Create TABLE `testDB`.`classes` (
          27   `class_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
          28   `class_name` VARCHAR(20NOT NULL,
          29   PRIMARY KEY (`class_id`)
          30 )
          31 
          32 //由于教師與班級是多對多關系,所有建立一個中間連接表以表示該關聯
          33 Create TABLE `testDB`.`link_teacher_classes` (
          34   `link_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
          35   `teacher_id` INTEGER UNSIGNED NOT NULL,
          36   `class_id` INTEGER UNSIGNED NOT NULL,
          37   PRIMARY KEY (`link_id`)
          38 )


          現在,建好表之后,我們還要寫幾個繼承自FLEA_Db_TableDataGateway父類的類,以對應數據庫中的Student,Teacher,Classes表(連接表不用了)如下:
           1 //學生表對應的類
           2 class Model_Student extends FLEA_Db_TableDataGateway{
           3         var $tableName = 'student';
           4         var $primaryKey = 'stu_id';
           5        
           6         /*
           7            這是一對一關系,一個學生對應唯一的一個Record檔案
           8            tableClass 對應要與之關聯一對一的表的對象類,即檔案表的類
           9            foreignKey是在檔案表中,對應學生表的一個外鍵接連字段,
          10            用該字段標識該檔案屬于哪個學生
          11            mappingName 就是用于在你查詢學生信息時,學生檔案字段的別名
          12         */
          13         var $hasOne = array(
          14                     'tableClass' => 'Model_Record',
          15                     'foreignKey' => 'stu_id',
          16                     'mappingName' => 'record'
          17         );
          18         /*
          19            這是從屬關系,一個學生屬于某一個班級,換過來說就是班級與學生一對多,
          20            一個班級有多個學生,而學生就只屬于一個班級
          21            tableClass 指定該類要與之有從屬關系的類,這里是班級類
          22            foreignKey 這里指定的是該表里的連接外表的字段,這里是學生表的班級ID字段
          23            注意:這里的foreignKey指的是本表的字段,而上面hasOne關系中的foreignKey
          24            指的是外表中的字段,要注意區分清楚
          25            mappingName這里就不多說了,跟上面的一樣,也是用于顯示區分的別名
          26         */
          27         var $belongsTo = array(
          28                 array(
          29             'tableClass' => 'Model_Classes',
          30             'foreignKey' => 'stu_class_id',
          31             'mappingName' => 'class'
          32         )
          33         );
          34 }
          35 
          36 //檔案表對應的類
          37 class Model_Record extends FLEA_Db_TableDataGateway{
          38         var $tableName = 'stu_record';
          39         var $primaryKey = 'record_id';
          40 }
          41 
          42 //教師表對應的類
          43 class Model_Teacher extends FLEA_Db_TableDataGateway{
          44         var $tableName = 'teacher';
          45         var $primaryKey = 'teacher_id';
          46 
          47         /*
          48            這里確立了教師與班級的多對多關系,一個教師可以教多個班級
          49            而一個班級也有多個教師
          50            tableClass 指定要建立多對多關系的表的類
          51            joinTable 這個屬性要注意一個,這個是指定教師表與班級表關系的連接表
          52            由于二維表的數據結構的原因,所以多對多關系要用一個中間表(即連接表)來表示
          53            連接表中就指明兩個表各自的主鍵ID就可以了,以兩個字段作復合主鍵,如不用復合
          54            主鍵,就新增加一個字段作主鍵也可,這沒關系
          55         */
          56         var $manyToMany = array(
          57                 array(
          58             'tableClass' => 'Model_Classes',
          59             'mappingName' => 'class',
          60             'joinTable' => 'link_teacher_classes',
          61         )
          62         );
          63 }
          64 
          65 class Model_Classes extends FLEA_Db_TableDataGateway{
          66         var $tableName = 'classes';
          67         var $primaryKey = 'class_id';
          68 
          69         /*
          70             這里確立了班級與學生的一對多關系
          71             tableClass 指定該表的類要與哪個表的類建立一對多關系
          72             foreignKey 外鍵ID,這里即指定學生表中定義的班級ID,這個是外表的字段
          73         */
          74         var $hasMany = array(
          75                 array(
          76             'tableClass' => 'Model_Student',
          77             'foreignKey' => 'stu_class_id',
          78             'mappingName' => 'students'
          79         )
          80         );
          81 
          82         var $manyToMany = array(
          83         // 由于多對多關系是雙向的,所以班級表也可以定義上與教師表的多對多關系
          84         // 也可以不寫,看需求而定,比如你想查看某個班級信息時,一并顯示該班
          85         // 有多少個任課老師的話,那就在這個班級類里加上關系,我這里就不寫了。。。
          86         );
          87 }


          以上的代碼就建立好了關系了,現在只管使用就是了。
          不過還提醒大家一點,在每個關系里,都有一個 ‘enabled’ 的屬性,如果設置為 false的話,則是將該關系禁掉,所以查詢出來的結果就沒有該關系的相應數據,這樣可以節省效率,按需要時才打開相應的關聯,該屬性默認為true 可以如下設置:
          1 array(
          2     'tableClass' => 'Model_Student',
          3     'foreignKey' => 'stu_class_id',
          4     'mappingName' => 'students',
          5     ‘enabled’ => false
          6 )


          現在我們來測試一下數據。(事先自行插入幾行數據用以測試)
          1 $classManager = FLEA::getSingleton('Model_Classes');
          2 $class =& $classManager->find(array('class_id' => 1));
          3 dump($class);


          出現結果如下:


          這個例子已含蓋了這四個關聯關系的基本用法了,其它的就由你們來探索了,不久后,我將會發表一下這此關聯方面的高級應用,有時間的話會寫寫這方面的東西。敬請期待!


          posted on 2008-07-29 14:02 姜大叔 閱讀(335) 評論(0)  編輯  收藏 所屬分類: PHP
          主站蜘蛛池模板: 鄂尔多斯市| 调兵山市| 三穗县| 武定县| 汉源县| 惠东县| 达日县| 桦甸市| 古交市| 山东省| 平邑县| 泸溪县| 永顺县| 寿宁县| 镇原县| 昆明市| 云龙县| 石城县| 光山县| 根河市| 西乡县| 炎陵县| 长海县| 和政县| 武城县| 天津市| 苗栗县| 蕉岭县| 乌鲁木齐县| 陆河县| 奇台县| 崇义县| 东源县| 三河市| 山东省| 安徽省| 青州市| 开封县| 中山市| 扶沟县| 永丰县|