【问题标题】:Custom fields created after data already entered在输入数据后创建的自定义字段
【发布时间】:2026-02-05 16:45:02
【问题描述】:

在将数据添加到数据库后创建自定义字段时遇到问题。我已经看了一段时间了,我的大脑已经关闭。我会尽力解释。

我有 2 个表,custom_fields 和 custom_fields_values。我还通过表格列对这些字段进行排序。当我从数据库中提取它们时,我必须加入表才能使结果以与字段相同的顺序显示。如果我不这样做,那么数据就会混淆。

$customfield = $pdo->prepare("SELECT * FROM custom_fields ORDER BY fieldorder ASC");
$customfield->execute();
$customfield = $customfield->fetchAll(PDO::FETCH_ASSOC);

$customfieldvals = $pdo->prepare("SELECT vals.* FROM custom_fields_values vals JOIN custom_fields fields ON fields.id = vals.fieldid WHERE vals.related_system=:relsystem ORDER BY fields.fieldorder ASC");
$customfieldvals->bindParam(':relsystem', $get_system['id'], PDO::PARAM_STR);
$customfieldvals->execute();
$customfieldvals = $customfieldvals->fetchAll(PDO::FETCH_ASSOC);

然后我有一个foreach 循环,它可以正确显示数据。问题是,当我添加一个没有值的新自定义字段时,因为它是在 custom_fields 表中创建的,但不是在 custom_fields_values 表中创建的,因此它与ON fields.id = vals.fieldid 不匹配。如果我在这些字段没有值的情况下使用这些字段,则它会采用另一个字段的值。本质上,因为它在id 级别的字段和fieldid 的值上不匹配,所以一切都搞砸了。

如果它没有创建值行,我如何才能到达哪里,它只会显示NULL,而不是取另一个字段的值?

编辑

我是否以正确的方式进行此操作,还是有更好的方法让自定义字段值跟随自定义字段而不是 JOIN 方法?

【问题讨论】:

    标签: php mysql join pdo


    【解决方案1】:

    您必须在查询中使用Left Join。 Left Join 将返回 null 如果它没有在 custom_fields_values 表中找到自定义字段的值。

    所以查询将如下所示。

    $customfieldvals = $pdo->prepare("SELECT vals.* FROM custom_fields_values vals LEFT JOIN custom_fields fields ON fields.id = vals.fieldid WHERE vals.related_system=:relsystem ORDER BY fields.fieldorder ASC");
    

    【讨论】:

    • 你试过Right Join吗?
    • @CrunchyToast 你也可以试试这个查询。 SELECT vals.* FROM custom_fields fields LEFT JOIN custom_fields_values vals ON fields.id = vals.fieldid WHERE vals.related_system=:relsystem ORDER BY fields.fieldorder ASC
    • 您最近的评论与我为解决此问题所做的非常接近。我将在下面添加答案。感谢您的反馈。
    【解决方案2】:

    我最初并没有考虑到这一点,但是我完全删除了$customfieldvals 查询并更改了$customfield 查询,而不是只针对值调用单独的查询。相反,这会将值锁定到字段,而不仅仅是链接它们。

    $customfield = $pdo->prepare("SELECT * FROM custom_fields fields LEFT JOIN custom_fields_values vals ON fields.id = vals.fieldid WHERE vals.related_system=:relsystem ORDER BY fieldorder ASC");
    $customfields->bindParam(':relsystem', $_GET['id'], PDO::PARAM_STR);
    $customfield->execute();
    $customfield = $customfield->fetchAll(PDO::FETCH_ASSOC);
    

    然后是我的foreach:

    foreach ($customfield as $fields) {...
    

    这让我可以打电话

    $fields['value']

    而不是

    $customfieldvals[$key]['value']

    【讨论】: