2016-08-02 44 views
2

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

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

$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方法?

回答

1

您必须在您的查询中使用Left Join。左连接将返回空如果它没有找到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"); 
+0

'LEFT JOIN'没有工作。它有相同的结果。 – CrunchyToast

+0

你试过用'Right Join'吗? –

+1

@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' –

0

我没想到这个最初,但不是调用一个单独的查询只重视我完全删除$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']