Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用codeigniter/php的实体属性值模型_Php_Mysql_Codeigniter_Entity Attribute Value - Fatal编程技术网

使用codeigniter/php的实体属性值模型

使用codeigniter/php的实体属性值模型,php,mysql,codeigniter,entity-attribute-value,Php,Mysql,Codeigniter,Entity Attribute Value,因此,我试图创建一种方法来构造我的数据库,以便能够自定义表单 我研究了EAV模式,下面是我的数据库结构: 表格 -表格编号 -表格名称 -表格(已加入) -修订表格 表:表单_字段 -字段id -表格编号 -字段类型(文本、收音机等) -字段默认值 -需要输入字段 表:form_数据 -数据标识 -字段id -表格编号 -字段值 因此,现在我可以将任何自定义表单存储到数据库中,如果我想获取单个表单的值,我只需通过“form_id”将其连接起来即可 问题是: 我希望能够在所有表单中搜索特定字段值。

因此,我试图创建一种方法来构造我的数据库,以便能够自定义表单

我研究了EAV模式,下面是我的数据库结构:

表格 -表格编号 -表格名称 -表格(已加入) -修订表格

表:表单_字段 -字段id -表格编号 -字段类型(文本、收音机等) -字段默认值 -需要输入字段

表:form_数据 -数据标识 -字段id -表格编号 -字段值

因此,现在我可以将任何自定义表单存储到数据库中,如果我想获取单个表单的值,我只需通过“form_id”将其连接起来即可

问题是:

我希望能够在所有表单中搜索特定字段值。

如何使用EAV模型实现这一点

此外,我还考虑将自定义数据存储为序列化(JSON)对象,但我不确定如何查询该数据


请注意,我在MYSQL中使用Codeigniter。因此,如果需要,对话可以使用Codeigniter库。

首先,表单数据表中的表单id字段似乎是多余的。每个表单数据记录引用表单字段记录(通过字段id),每个表单字段记录引用表单记录(通过表单id)。因此,您不需要将form_id放入form_数据表中

您的问题似乎是:如何基于特定字段值获取表单id值

下面是一个简单的SQL查询,可以实现以下功能:

SELECT f.form_id FROM form_data d 
JOIN form_fields f USING(field_id) 
WHERE d.field_value = '??????'

首先,form_数据表中的form_id字段似乎是多余的。每个表单数据记录引用表单字段记录(通过字段id),每个表单字段记录引用表单记录(通过表单id)。因此,您不需要将form_id放入form_数据表中

您的问题似乎是:如何基于特定字段值获取表单id值

下面是一个简单的SQL查询,可以实现以下功能:

SELECT f.form_id FROM form_data d 
JOIN form_fields f USING(field_id) 
WHERE d.field_value = '??????'

从您的问题来看,您的要求似乎是在具有表单字段类型和字段值时获取表单id-

为了实现这一点,您可以尝试以下查询-

首先触发此查询以获取具有特定字段类型=

    $sql = "SELECT ff.form_id from form_fields ff where ff.field_type = 'The field type you are searching for'";

    $result = $this->db->query($sql);

    $form_ids = $result->result_array();
现在,您可以在第二次查询中使用此数组来获得最终结果,如下所示-

    $this->db->select('fd.form_id');
    $this->db->from('form_data fd');
    $this->db->where('fd.field_value','your field value');
    $this->db->where_in('fd.form_id',$form_ids);
    $required_form_id = $this->db->get();
因此,在变量
$required\u form\u id
中,您将拥有所需的表单id

我的建议是,在form_fields表中,对field_type列使用enum


希望这对您有所帮助。

从您的问题来看,您的要求似乎是在拥有表单字段类型和字段值时获取表单id-

为了实现这一点,您可以尝试以下查询-

首先触发此查询以获取具有特定字段类型=

    $sql = "SELECT ff.form_id from form_fields ff where ff.field_type = 'The field type you are searching for'";

    $result = $this->db->query($sql);

    $form_ids = $result->result_array();
现在,您可以在第二次查询中使用此数组来获得最终结果,如下所示-

    $this->db->select('fd.form_id');
    $this->db->from('form_data fd');
    $this->db->where('fd.field_value','your field value');
    $this->db->where_in('fd.form_id',$form_ids);
    $required_form_id = $this->db->get();
因此,在变量
$required\u form\u id
中,您将拥有所需的表单id

我的建议是,在form_fields表中,对field_type列使用enum


希望这对您有所帮助。

免责声明:我不知道PHP或CodeIgniter,但我愿意断言它们都没有对EAV的任何内置支持。注意到这一点,我对EAV有很多了解,所以我将从这个角度回答

当你写关于搜索一个特定的值时,我假设你的意思也是在一个特定的字段中。既然如此,将数据放在表单表之外的XML CLOB中(例如数据),并使用它进行搜索。认真地假设XML看起来像:

<data>
    <field id="[field_id]">value</field>
</data>
为什么??针对EAV模型搜索多个标准是一个挑战。考虑这个例子:

SELECT f.form_id
FROM
  form f
    INNER JOIN form_fields f1 ON f1.form_id = f.form_id
    INNER JOIN form_fields f2 ON f2.form_id = f.form_id
WHERE 
  f.form_id = ?
  AND 
  (f1.field_id = ? AND f1.field_value = ?)
  AND 
  (f2.field_id = ? AND f2.field_value = ?)
这一切似乎都很好,现在将更改为,所有的地狱都会消失

SELECT f.form_id
FROM
  form f
    INNER JOIN form_fields f1 ON f1.form_id = f.form_id
    INNER JOIN form_fields f2 ON f2.form_id = f.form_id
WHERE 
  f.form_id = ?
  OR 
  (f1.field_id = ? AND f1.field_value = ?)
  OR 
  (f2.field_id = ? AND f2.field_value = ?)
你看到问题了吗?FROM子句中的内部联接意味着无论发生什么记录,无论WHERE子句如何返回数据。因此,EAV不是加入FROM子句+WHERE子句,而是要求WHERE中存在一个:

SELECT f.form_id
FROM
  form f
WHERE 
  f.form_id = ?
  AND (
    EXISTS (
      SELECT f1.form_id FROM form_fields f1 
      WHERE f1.field_id = ? AND f1.field_value = ? AND f1.form_id = f.form_id
    )
    -- note OR search 
    EXISTS (
      SELECT f2.form_id FROM form_fields f2
      WHERE f2.field_id = ? AND f2.field_value = ? AND f2.form_id = f.form_id
    )
  )
有点难看吧?那和。添加搜索特定数据类型(如日期和整数)的愿望,您可以转换或处理表单字段表中的多个列(如字段日期值、字段整数值等)


CULL CULB在查询时只考虑表,也考虑多值属性的可能性(多选择或复选框)。<> P> <强>免责声明< /强>:我不知道PHP或CODENITENT,但我愿意断言,没有任何一种内置的EAV支持。注意到这一点,我对EAV有很多了解,所以我将从这个角度回答

当你写关于搜索一个特定的值时,我假设你的意思也是在一个特定的字段中。既然如此,将数据放在表单表之外的XML CLOB中(例如数据),并使用它进行搜索。认真地假设XML看起来像:

<data>
    <field id="[field_id]">value</field>
</data>
为什么??针对EAV模型搜索多个标准是一个挑战。考虑这个例子:

SELECT f.form_id
FROM
  form f
    INNER JOIN form_fields f1 ON f1.form_id = f.form_id
    INNER JOIN form_fields f2 ON f2.form_id = f.form_id
WHERE 
  f.form_id = ?
  AND 
  (f1.field_id = ? AND f1.field_value = ?)
  AND 
  (f2.field_id = ? AND f2.field_value = ?)
这一切似乎都很好,现在将更改为,所有的地狱都会消失

SELECT f.form_id
FROM
  form f
    INNER JOIN form_fields f1 ON f1.form_id = f.form_id
    INNER JOIN form_fields f2 ON f2.form_id = f.form_id
WHERE 
  f.form_id = ?
  OR 
  (f1.field_id = ? AND f1.field_value = ?)
  OR 
  (f2.field_id = ? AND f2.field_value = ?)
你看到问题了吗?FROM子句中的内部联接意味着无论发生什么记录,无论WHERE子句如何返回数据。因此,EAV不是加入FROM子句+WHERE子句,而是要求WHERE中存在一个:

SELECT f.form_id
FROM
  form f
WHERE 
  f.form_id = ?
  AND (
    EXISTS (
      SELECT f1.form_id FROM form_fields f1 
      WHERE f1.field_id = ? AND f1.field_value = ? AND f1.form_id = f.form_id
    )
    -- note OR search 
    EXISTS (
      SELECT f2.form_id FROM form_fields f2
      WHERE f2.field_id = ? AND f2.field_value = ? AND f2.form_id = f.form_id
    )
  )
有点难看吧?那和。添加搜索特定数据类型(如日期和整数)的愿望,您可以转换或处理表单字段表中的多个列(如字段日期值、字段整数值等)

因此,XML CURB在查询时只考虑表,也考虑多值属性的可能性(多选择或复选框)。