<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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é)生信息時,學(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         // 也可以不寫,看需求而定,比如你想查看某個班級信息時,一并顯示該班
    85         // 有多少個任課老師的話,那就在這個班級類里加上關(guān)系,我這里就不寫了。。。
    86         );
    87 }


    以上的代碼就建立好了關(guān)系了,現(xiàn)在只管使用就是了。
    不過還提醒大家一點,在每個關(guān)系里,都有一個 ‘enabled’ 的屬性,如果設(shè)置為 false的話,則是將該關(guān)系禁掉,所以查詢出來的結(jié)果就沒有該關(guān)系的相應(yīng)數(shù)據(jù),這樣可以節(jié)省效率,按需要時才打開相應(yīng)的關(guān)聯(liá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)用,有時間的話會寫寫這方面的東西。敬請期待!


    posted on 2008-07-29 14:02 姜大叔 閱讀(327) 評論(0)  編輯  收藏 所屬分類: PHP
    主站蜘蛛池模板: 亚洲午夜国产精品无卡| 久久精品国产精品亚洲蜜月| 亚洲熟妇AV乱码在线观看| 美女视频黄a视频全免费| 亚洲喷奶水中文字幕电影| 99久久99这里只有免费费精品| 91亚洲一区二区在线观看不卡| 182tv免费视视频线路一二三| 亚洲精品乱码久久久久久下载| 五月亭亭免费高清在线| 亚洲人成影院在线高清| 麻豆国产入口在线观看免费| 国产亚洲精品美女久久久久| 亚洲Av无码国产情品久久 | 亚洲妇熟XXXX妇色黄| 日韩免费在线观看视频| 亚洲美女免费视频| 成人看的午夜免费毛片| 色婷婷综合缴情综免费观看| 日本亚洲成高清一区二区三区| 6080午夜一级毛片免费看| 亚洲精品中文字幕无码A片老| 亚洲?v女人的天堂在线观看| 久久一区二区免费播放| 亚洲婷婷综合色高清在线| 免费鲁丝片一级在线观看| 一级毛片免费播放男男| 久久夜色精品国产噜噜亚洲AV| 好吊妞在线成人免费| sss在线观看免费高清| 亚洲一区二区三区日本久久九| 日韩在线免费电影| 国产在线国偷精品免费看| 亚洲天堂一区在线| 亚洲国产日韩在线观频| 最近中文字幕免费完整| 国产精品亚洲综合天堂夜夜| 无码久久精品国产亚洲Av影片| 成人毛片免费网站| 国产一级在线免费观看| 亚洲日韩国产一区二区三区在线|