我正在使用codeigniter开发一个网络平台(第一次使用CI)来计算越来越多不同产品的报价。
我面临的问题是我的每个产品都有不同的10+选项,但我想将这些数据保存到我数据库中的一个表中。我之前为每个产品使用了不同的表格,允许表格结构代表不同的选项集,但随着我们不断增长的产品范围,这个表格的可扩展性不高。
经过一些研究后,似乎有一种解决方案是使用'序列化'功能将每个产品的所有发布数据(来自报价表)存储在一列中,然后在我想要使用此数据时反序列化...
将数据序列化是最好的方法,是否有人能够提供一个简单的示例来说明如何处理表单提交/检索数据中的插入?
非常感谢
编辑:只搜索产品类型或唯一ID。我的想法是有一个像'id,product_type,product_options'这样的表格,其中product_options包含序列化数据?
编辑2:采取EAV方法似乎是一个很好的呼喊。我习惯于查询并返回一个结果对象以传递给视图(例如$query->quote_ref
,$query->quote_date
)。当查询返回多行时,有没有人能指出我如何使用单引号数据的正确方向,每个属性一个?
答案 0 :(得分:2)
如你所说,你不需要搜索序列化数据,那么这种方法会没问题。我会选择json_encode,因为这种形式的数据更具人性化。
然后代码将取决于您的DAL,但基本的例子是:
$productOptions=array($_POST['option1'], $_POST['option2']);//etc will need to validate data
$databaseMapper->product_type='product type';
//your product_options column is suitable sized varchar
$databaseMapper->product_options=json_encode($productOptions);
$databaseMapper->save();
要检索:
$databaseMapper->loadById(20);
//$productOptions is a standard php array
$productOptions = json_decode($databaseMapper->product_options, true);
编辑重新显示在您的视图中。 这是特定于codeignitor(而上述不是)。 基于此处的代码:http://ellislab.com/codeigniter/user-guide/general/views.html
在您的控制器中:
//code similar to above to retrieve product options data, ideally contained within a model
$data['productOptions']=$productOptions;
$this->load->view('content', $data);
在您看来:
<ul>
<?php foreach ($productOptions as $option):?>
<li><?php echo $option;?></li>
<?php endforeach;?>
</ul>