我有三张桌子
common_addons。
hotel_addons。
菜单
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函数)。
答案 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
等等...