![](/img/trans.png)
[英]Join three tables with primary key in one and foreign key in other two tables
[英]Connect three tables with foreign key and many to one
我有三张桌子
common_addons。
hotel_addons。
菜单
的ID common_addons
是foreign_key属性的common_addons_id
在hotel_addons
和ID hotel_addons
是属性的foreign_key hotel_addons_id
表menu
。
$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_id
表menu
common_addons
的name
。 属性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.