如何填写中间表?

时间:2017-07-28 13:51:51

标签: php postgresql symfony

我在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?

1 个答案:

答案 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;