PodsData::insert_on_duplicate PHP Method

insert_on_duplicate() public static method

Since: 2.0
public static insert_on_duplicate ( string $table, array $data, array $formats = [] ) : mixed
$table string Name of the table to update
$data array column => value pairs
$formats array For $wpdb->prepare, uses sprintf formatting
return mixed Sanitized query string
    public static function insert_on_duplicate($table, $data, $formats = array())
    {
        /**
         * @var $wpdb wpdb
         */
        global $wpdb;
        $columns = array_keys($data);
        $update = array();
        $values = array();
        foreach ($columns as $column) {
            $update[] = "`{$column}` = VALUES( `{$column}` )";
            $values[] = "%s";
        }
        if (empty($formats)) {
            $formats = $values;
        }
        $columns_data = implode('`, `', $columns);
        $formats = implode(", ", $formats);
        $update = implode(', ', $update);
        $sql = "INSERT INTO `{$table}` ( `{$columns_data}` ) VALUES ( {$formats} ) ON DUPLICATE KEY UPDATE {$update}";
        return $wpdb->prepare($sql, $data);
    }

Usage Example

 /**
  * @return string
  */
 public function migrate_relationships()
 {
     if (true === $this->check_progress(__FUNCTION__)) {
         return '1';
     }
     $migration_limit = (int) apply_filters('pods_upgrade_item_limit', 1500);
     $migration_limit = max($migration_limit, 100);
     $last_id = (int) $this->check_progress(__FUNCTION__);
     $sql = "\n            SELECT `r`.*, `p`.`tbl_row_id` AS `real_id`, `p`.`datatype`\n            FROM `@wp_pod_rel` AS `r`\n            LEFT JOIN `@wp_pod` AS `p` ON `p`.`id` = `r`.`pod_id`\n            WHERE {$last_id} < `r`.`id`\n                AND `r`.`pod_id` IS NOT NULL\n                AND `r`.`field_id` IS NOT NULL\n                AND `p`.`id` IS NOT NULL\n            ORDER BY `r`.`id`\n            LIMIT 0, {$migration_limit}\n        ";
     $rel = pods_query($sql);
     $last_id = true;
     $pod_types = pods_query("SELECT `id`, `name` FROM `@wp_pod_types` ORDER BY `id`");
     $types = array();
     $x = 0;
     if (!empty($rel) && !empty($pod_types)) {
         foreach ($pod_types as $type) {
             $type->name = pods_clean_name($type->name);
             $types[$type->id] = $this->api->load_pod(array('name' => $type->name), false);
             if (empty($types[$type->id])) {
                 return pods_error(sprintf(__('Pod <strong>%s</strong> not found, relationships cannot be migrated', 'pods'), $type->name));
             }
             $pod_fields = pods_query("SELECT `id`, `name` FROM `@wp_pod_fields` WHERE `datatype` = {$type->id} ORDER BY `id`");
             $types[$type->id]['old_fields'] = array();
             foreach ($pod_fields as $field) {
                 // Handle name changes
                 if (in_array($field->name, array('created', 'modified', 'author'))) {
                     $field->name .= '2';
                 }
                 $types[$type->id]['old_fields'][$field->id] = $field->name;
             }
         }
         foreach ($rel as $r) {
             $r->pod_id = (int) $r->pod_id;
             if (!isset($types[$r->datatype]) || !isset($types[$r->datatype]['old_fields'][$r->field_id])) {
                 continue;
             }
             if (!isset($types[$r->datatype]['fields'][$types[$r->datatype]['old_fields'][$r->field_id]])) {
                 continue;
             }
             $field = $types[$r->datatype]['fields'][$types[$r->datatype]['old_fields'][$r->field_id]];
             if (!in_array($field['type'], array('pick', 'file'))) {
                 continue;
             }
             $pod_id = $types[$r->datatype]['id'];
             $field_id = $field['id'];
             $item_id = $r->real_id;
             $related_pod_id = 0;
             $related_field_id = 0;
             $related_item_id = $r->tbl_row_id;
             if ('pick' == $field['type']) {
                 $old_sister_id = (int) pods_var('_pods_1x_sister_id', $field['options'], 0);
                 if (0 < $old_sister_id) {
                     $sql = "\n                            SELECT `f`.`id`, `f`.`name`, `t`.`name` AS `pod`\n                            FROM `@wp_pod_fields` AS `f`\n                            LEFT JOIN `@wp_pod_types` AS `t` ON `t`.`id` = `f`.`datatype`\n                            WHERE `f`.`id` = " . $old_sister_id . " AND `t`.`id` IS NOT NULL\n                            ORDER BY `f`.`id`\n                            LIMIT 1\n                        ";
                     $old_field = pods_query($sql);
                     if (empty($old_field)) {
                         continue;
                     }
                     $old_field = $old_field[0];
                     $related_field = $this->api->load_field(array('name' => $old_field->name, 'pod' => $old_field->pod));
                     if (empty($related_field)) {
                         continue;
                     }
                     $related_pod_id = $related_field['pod_id'];
                     $related_field_id = $related_field['id'];
                 } elseif ('pod' == $field['pick_object'] && 0 < strlen($field['pick_val'])) {
                     $related_pod = $this->api->load_pod(array('name' => $field['pick_val']), false);
                     if (empty($related_pod)) {
                         continue;
                     }
                     $related_pod_id = $related_pod['id'];
                 }
             }
             $r->id = (int) $r->id;
             $pod_id = (int) $pod_id;
             $field_id = (int) $field_id;
             $item_id = (int) $item_id;
             $related_pod_id = (int) $related_pod_id;
             $related_field_id = (int) $related_field_id;
             $related_item_id = (int) $related_item_id;
             $r->weight = (int) $r->weight;
             $table_data = array('id' => $r->id, 'pod_id' => $pod_id, 'field_id' => $field_id, 'item_id' => $item_id, 'related_pod_id' => $related_pod_id, 'related_field_id' => $related_field_id, 'related_item_id' => $related_item_id, 'weight' => $r->weight);
             $table_formats = array_fill(0, count($table_data), '%d');
             $sql = PodsData::insert_on_duplicate("@wp_podsrel", $table_data, $table_formats);
             pods_query($sql);
             $last_id = $r->id;
             $x++;
             if (10 < $x) {
                 $this->update_progress(__FUNCTION__, $last_id);
                 $x = 0;
             }
         }
     }
     $this->update_progress(__FUNCTION__, $last_id);
     if ($migration_limit == count($rel)) {
         return '-2';
     } else {
         return '1';
     }
 }