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

          在FleaPHP中,支持以下四種關(guān)聯(lián)關(guān)系:
                   
                * HAS_ONE
                * HAS_MANY
                * MANY_TO_MANY
                * BELONGS_TO
                   
          分別對應(yīng)FLEA_Db_TableDataGateway表中的 $hasOne,$hasMany,$manyToMany,$belongsTo 屬性

          我們下面就用 老師,學(xué)生,學(xué)生檔案,班級的例子說說這幾個關(guān)系。

          以下是SQL代碼:
           1 //學(xué)生表
           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 //學(xué)生檔案表
          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 //由于教師與班級是多對多關(guān)系,所有建立一個中間連接表以表示該關(guān)聯(lián)
          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 )


          現(xiàn)在,建好表之后,我們還要寫幾個繼承自FLEA_Db_TableDataGateway父類的類,以對應(yīng)數(shù)據(jù)庫中的Student,Teacher,Classes表(連接表不用了)如下:
           1 //學(xué)生表對應(yīng)的類
           2 class Model_Student extends FLEA_Db_TableDataGateway{
           3         var $tableName = 'student';
           4         var $primaryKey = 'stu_id';
           5        
           6         /*
           7            這是一對一關(guān)系,一個學(xué)生對應(yīng)唯一的一個Record檔案
           8            tableClass 對應(yīng)要與之關(guān)聯(lián)一對一的表的對象類,即檔案表的類
           9            foreignKey是在檔案表中,對應(yīng)學(xué)生表的一個外鍵接連字段,
          10            用該字段標(biāo)識該檔案屬于哪個學(xué)生
          11            mappingName 就是用于在你查詢學(xué)生信息時(shí),學(xué)生檔案字段的別名
          12         */
          13         var $hasOne = array(
          14                     'tableClass' => 'Model_Record',
          15                     'foreignKey' => 'stu_id',
          16                     'mappingName' => 'record'
          17         );
          18         /*
          19            這是從屬關(guān)系,一個學(xué)生屬于某一個班級,換過來說就是班級與學(xué)生一對多,
          20            一個班級有多個學(xué)生,而學(xué)生就只屬于一個班級
          21            tableClass 指定該類要與之有從屬關(guān)系的類,這里是班級類
          22            foreignKey 這里指定的是該表里的連接外表的字段,這里是學(xué)生表的班級ID字段
          23            注意:這里的foreignKey指的是本表的字段,而上面hasOne關(guān)系中的foreignKey
          24            指的是外表中的字段,要注意區(qū)分清楚
          25            mappingName這里就不多說了,跟上面的一樣,也是用于顯示區(qū)分的別名
          26         */
          27         var $belongsTo = array(
          28                 array(
          29             'tableClass' => 'Model_Classes',
          30             'foreignKey' => 'stu_class_id',
          31             'mappingName' => 'class'
          32         )
          33         );
          34 }
          35 
          36 //檔案表對應(yīng)的類
          37 class Model_Record extends FLEA_Db_TableDataGateway{
          38         var $tableName = 'stu_record';
          39         var $primaryKey = 'record_id';
          40 }
          41 
          42 //教師表對應(yīng)的類
          43 class Model_Teacher extends FLEA_Db_TableDataGateway{
          44         var $tableName = 'teacher';
          45         var $primaryKey = 'teacher_id';
          46 
          47         /*
          48            這里確立了教師與班級的多對多關(guān)系,一個教師可以教多個班級
          49            而一個班級也有多個教師
          50            tableClass 指定要建立多對多關(guān)系的表的類
          51            joinTable 這個屬性要注意一個,這個是指定教師表與班級表關(guān)系的連接表
          52            由于二維表的數(shù)據(jù)結(jié)構(gòu)的原因,所以多對多關(guān)系要用一個中間表(即連接表)來表示
          53            連接表中就指明兩個表各自的主鍵ID就可以了,以兩個字段作復(fù)合主鍵,如不用復(fù)合
          54            主鍵,就新增加一個字段作主鍵也可,這沒關(guān)系
          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             這里確立了班級與學(xué)生的一對多關(guān)系
          71             tableClass 指定該表的類要與哪個表的類建立一對多關(guān)系
          72             foreignKey 外鍵ID,這里即指定學(xué)生表中定義的班級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         // 由于多對多關(guān)系是雙向的,所以班級表也可以定義上與教師表的多對多關(guān)系
          84         // 也可以不寫,看需求而定,比如你想查看某個班級信息時(shí),一并顯示該班
          85         // 有多少個任課老師的話,那就在這個班級類里加上關(guān)系,我這里就不寫了。。。
          86         );
          87 }


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


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


          出現(xiàn)結(jié)果如下:


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


          posted on 2008-07-29 14:02 姜大叔 閱讀(330) 評論(0)  編輯  收藏 所屬分類: PHP
          主站蜘蛛池模板: 江门市| 马公市| 宾阳县| 若尔盖县| 昌都县| 赣州市| 大港区| 敦化市| 临邑县| 博爱县| 滨州市| 麻城市| 登封市| 高尔夫| 子洲县| 河南省| 凤山市| 从化市| 盖州市| 南雄市| 句容市| 田东县| 巴里| 韶山市| 乌审旗| 平和县| 精河县| 香港| 新疆| 石渠县| 白水县| 河北省| 漠河县| 长汀县| 沭阳县| 涿鹿县| 姜堰市| 佛学| 英德市| 浦县| 闵行区|