使用外键连接三个表,并将多个表连接到一个

时间:2017-06-28 08:02:35

标签: php mysql database codeigniter

我有三张桌子

  1. common_addons。

  2. hotel_addons。

  3. 菜单

  4. common_addons的id是common_addons_id中属性hotel_addons的foreign_key,而hotel_addons的id是表hotel_addons_id中属性menu的foreign_key。

            $this->db->join('hotel_addons', 'hotel_addons.id = menu.addon_id');
            $this->db->join('common_addons', 'addons.id = hotel_addons.addons_id');
            $this->db->from('menu');
            $this->db->join('menu', 'menu.addon_id = hotel_addons.id');
    

    我希望common_addons name通过表menu,其中包含属性hotel_addons_id。属性hotel_addons_id包含由逗号分隔的多个ids个hotel_addons(通过Implode函数)。

1 个答案:

答案 0 :(得分:1)

这就是你现在拥有的

menu
--------------
id                           1
hotel_addons_id              1,2,3,4

这不是"答案"这就解释了ManyToOne和OneToMany如何制作一个ManyToMany

hotel_addons
--------------
id                           1        //one to many - one addon has many records in the bridge table

menu_hotel_addons  (bridge table)  = many to many
-------------------------
menu_id                        1     //many to one  - many bridge records point to the menu
hotel_addons_id                1     //many to one  - many bridge records point to the addons table

 menu
 --------------
id                           1     //one to many  - one menu has many records in the bridge table

在桥接表中,主键是两个外键的复合键,每个外键都是一个代理键(自动增量)。

换句话说,菜单可以有许多插件,插件可以属于许多菜单项。你现在的方式,是一个糟糕的黑客,永远不会给你你需要的东西。

您无法加入逗号分隔列表(至少不容易)。做这样的事情要容易得多:

     SELECT 
        m.*,
        a.*
     FROM
         menu AS m
     JOIN
          menu_hotel_addons AS ma
     ON 
        m.id = ma.menu_id
     JOIN
        hotel_addons  AS a
     ON
        ma.hotel_addons_id = a.id

等等...