<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
          在關系數據庫應用中,都離不開表與表的關聯,表與表之間建立了關聯關系后就可以提供很多方便的操作了,比如我要查詢一個學生的信息,如果不建立學生與班級的關系的話,那么,只可以顯示出學生的基本信息,而學生是屬于某一個班級的,我現在想知道這個學生的信息與該學生所在的班級的信息,甚至是該學生的任課老師等信息,建立了學生表,與班級表,老師表之間的關系就方便好多了,用一個學生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 姜大叔 閱讀(328) 評論(0)  編輯  收藏 所屬分類: PHP
    主站蜘蛛池模板: 四虎国产成人永久精品免费| GOGOGO高清免费看韩国| 免费A级毛片无码A∨ | 免费看片在线观看| 亚洲伦理一区二区| 1000部拍拍拍18免费网站| 亚洲国产成人va在线观看网址| 在线看片v免费观看视频777 | 日本高清免费aaaaa大片视频| 亚洲欧洲国产综合AV无码久久| 国产精品国产午夜免费福利看 | 日本免费福利视频| 日韩精品无码免费视频| 三上悠亚亚洲一区高清| 日韩免费电影网址| 国产亚洲sss在线播放| 国产精品成人无码免费| 黄 色一级 成 人网站免费| 亚洲国产一区国产亚洲| 国产h视频在线观看免费| 丰满亚洲大尺度无码无码专线 | 国产av无码专区亚洲av毛片搜| 精品亚洲视频在线观看| 免费无码H肉动漫在线观看麻豆 | 亚洲国产老鸭窝一区二区三区 | a级毛片高清免费视频就| 久久久久亚洲AV无码观看| 妞干网免费观看视频| fc2成年免费共享视频网站| 亚洲高清在线视频| 天天摸天天操免费播放小视频| 丁香六月婷婷精品免费观看| 久久伊人久久亚洲综合| 国产成人免费高清激情视频| 国产精品无码免费专区午夜| 亚洲欧洲精品一区二区三区| 免费在线观看视频a| 2022久久国产精品免费热麻豆| 风间由美在线亚洲一区| 亚洲国产精品久久久久久| 国产精品免费看香蕉|