我在ManyToMany关系中有两个表:
TableMolécules:
id | main_name | others …
--- | --------- | ------
1 | caféine | others …
表jsonTextMining:
id | title | molecule_name | others …
---|------- |-------------------------------------|------
1 | title1 | colchicine, cellulose, acid, caféine| others …
和1个中间表:
表json_text_mining_molecule (这是一个例子,我没有成功填写它):
json_text_mining_id | molecule_id
------------------------ | ---------------
1 | corresponding molecule id's
1 | corresponding molecule id's
2 | corresponding molecule id's
我的问题是molecule_name
中的jsonTextMining
是一个字符串,我需要先将它们分开。
我试过了:
$molecules = explode (', ', $jsonTextMining→getMoleculeName());
foreach ($molecules as $molecule) {
$jsonTextMining->setMolecule($molecule);
}
$em->persist($jsonTextMining);
$em->flush;
但是我认为我应该循环jsonTexMining而且要诚实,我不知道在哪里放这部分代码。是在一个随机页面上,代码会执行,我应该按一下吗?
我确切知道如何在存在OneToMany关系的情况下用id填充表格,我使用sql
这样:
UPDATE table1 SET id_relation1 = table2.id
FROM table2
WHERE table1.main_name = table2.main_name
但是这段代码只填充一个带有id的列,而且总是存在字符串的问题。有没有办法让这些id连接起来,所以每个分子都会有几个jsonTextMining?
答案 0 :(得分:0)
您可以先使用regexp_split函数分割字符串:
select id, regexp_split_to_table(molecule_name,', ') as m_name from jsonTextMining
这将为您提供一个ID和名称表:
id | name
----+------------
1 | acid
1 | caffeine
1 | cellulose
1 | colchicine
接下来,您可以从上面的内容中读取,将名称与分子表中的ID匹配并聚合ID。所有这些都会导致这一点:
select s.id, string_agg(m.id::text, ', ')
from (select id, regexp_split_to_table(molecule_name,', ') as m_name
from jsonTextMining) as s, molecules m
where m.main_name = s.m_name group by s.id;
这给出了这个结果:
id | string_agg
----+------------
1 | 4, 1, 3, 2
(1 row)
如果您不想聚合结果并在每个分子中显示一行,那么只需删除string_agg和组:
select s.id, m.id
from (select id, regexp_split_to_table(molecule_name,', ') as m_name
from jsonTextMining) as s, molecules m
where m.main_name = s.m_name;