将动态Object属性名称插入Database

时间:2017-05-16 13:15:57

标签: php mysql codeigniter sql-insert

好吧所以我有一个我想要运行的插入查询,但我遇到的问题是获取我需要插入的对象属性/值。 假设我有一个类似下面的查询。

$this->db->insert('tblitems_in', array(
    'platform' => $item['Platform'],
    'ram' => $item['RAM'],
    'qty' => $item['qty'],
    'rate' => number_format($item['rate'], 2, '.', ''),
    'rel_id' => $insert_id,
    'rel_type' => 'estimate',
    'item_order' => $item['order'],
    'unit' => $item['unit']
));

当用户在网页上选择RAM来设置$ item对象属性' RAM'到被挑选的价值。现在,如果他们选择HardDrive,那么该属性名称现在将作为' HardDrive'他们选择的价值。有没有办法可以取代' ram'和' RAM'从下面带有变量的示例中,我可以更改要插入并插入相应db列的属性名称?

修改

我应该补充一点,网页上的选项也是从数据库中动态创建的,因此在编码时我不知道属性名称是什么。它们可能是RAM,HardDrive,处理器,甚至可能是大象。我希望我可以使用变量,以便我可以查看用于创建网页的数据库,以便我知道属性名称,然后将这些名称动态添加到查询中。

修改

现在我正在使用以下代码,以便从网页用于创建自身的数据库中获取可从网页接收的所有可能选项。

$plat_options = $this->db->get('tblplatform_options')->row()->name;

现在在数据库中,它只填充了名称RAM和HardDrive,以便为测试目的而知道。所以这会返回$ plat_options = {RAM,HardDrive}。我现在必须弄清楚如何测试是$ item有这些(RAM和HardDrive)作为属性,如果$ item有它们然后将它们添加到先前显示的查询中。

2 个答案:

答案 0 :(得分:2)

您可以设置key =>的数组变量名,然后遍历这些值以查看它们是否存在于$item变量中,如果是,则将该值添加到要插入到数据库中的数据中:

//default array of data to insert
$data = [
    'platform' => $item['Platform'],
    'qty' => $item['qty'],
    'rate' => number_format($item['rate'], 2, '.', ''),
    'rel_id' => $insert_id,
    'rel_type' => 'estimate',
    'item_order' => $item['order'],
    'unit' => $item['unit']
];

//Get column names from db
$plat_options = $this->db->get('tblplatform_options')->row()->name;
// $plat_options = [RAM, HardDrive]

//Check if $item[$name] exists. If it does, add that to the
// array of data to be inserted
foreach($plat_options as $key) {
    if(array_key_exists($key, $item)) {
        $data[$key] = $item[$key];
    }
}

$this->db->insert('tblitems_in', $data);

修改

我不确定这是否有用(我不了解用例)。

可以使用array_diff_key获取$item但不在$data中的数组键列表。使用此数组键,您可以添加缺少的键。

我已经改变了我之前的代码来证明这一点。

答案 1 :(得分:2)

您可以根据收到的任何字段数据一次创建一个元素。我使用了switch语句,但它也可以是一个简单的if / then / else。

$data_array = array();
$data_array['platform'] = $item['Platform']
switch($item['Object'] {
    case 'HardDrive':
        $data_array['harddrive'] = $item['HardDrive'];
        break;
    case 'RAM':
        $data_array['ram'] = $item['RAM'];
        break;
}
$data_array['qty'] = $item['qty'];
$data_array['rate' = number_format($item['rate'], 2, '.', '');
$data_array['rel_id'] = $insert_id;
$data_array['rel_type' = 'estimate';
$data_array['item_order'] = $item['order'];
$data_array['unit'] = $item['unit'];


$this->db->insert('tblitems_in', $data_array);