繁体   English   中英

用外键连接三张表,多对一

[英]Connect three tables with foreign key and many to one

我有三张桌子

  1. common_addons。

  2. hotel_addons。

  3. 菜单

的ID common_addons是foreign_key属性的common_addons_idhotel_addons和ID hotel_addons是属性的foreign_key hotel_addons_idmenu

        $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');

我希望通过包含属性hotel_addons_idmenu common_addonsname 属性hotel_addons_id包含由逗号分隔(通过Implode函数)的hotel_addons的多个ids

这就是你现在所拥有的

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

等等...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM