function chado_update_property

2.x chado_update_property($record, $property, $options = array())

Update a property for a given base table record and property name.


$record: An associative array used to identify the record to which the property should be updated. The following keys must be used: -table: The base table for which the property should be updated. Thus to update a property for a feature the base_table=feature. -id: The primary key value of the base table. The property will be associated with the record that matches this id. -prop_id: The primary key in the [table]prop table. If this value is supplied then the 'table' and 'id' keys are not needed.

$property: An associative array used to specify the property to be updated. It can contain the following keys. The keys must be specified to uniquely identify the term to be applied. If the options identify more than one CV term then an error will occur. -type_name: The cvterm name to be selected. -type_id: The cvterm_id of the term to be selected. -cv_id: The cv_id of the CV that contains the term. -cv_name: The name of the CV that contains the term. -value: The specific value for the property. -rank: The specific rank for the property.

$options: An associative array containing the following keys: -insert_if_missing: A boolean indicating whether a record should be inserted if one doesn't exist to update.

Return value

Return TRUE on Update/Insert and FALSE otherwise

Related topics


tripal_core/api/, line 472
Provides an application programming interface (API) to manage data withing the Chado database.


function chado_update_property($record, $property, $options = array()) {

  $base_table = array_key_exists('table', $record) ? $record['table'] : '';
  $base_id = array_key_exists('id', $record) ? $record['id'] : '';
  $prop_id = array_key_exists('prop_id', $record) ? $record['prop_id'] : '';

  $type_name = array_key_exists('type_name', $property) ? $property['type_name'] : '';
  $type_id = array_key_exists('type_id', $property) ? $property['type_id'] : '';
  $cv_name = array_key_exists('cv_name', $property) ? $property['cv_name'] : '';
  $cv_id = array_key_exists('cv_id', $property) ? $property['cv_id'] : '';
  $value = array_key_exists('value', $property) ? $property['value'] : '';
  $rank = array_key_exists('rank', $property) ? $property['rank'] : 0;

  $insert_if_missing = array_key_exists('insert_if_missing', $options) ? $options['insert_if_missing'] : FALSE;

  // first see if the property is missing (we can't update a missing property
  $prop = chado_get_property($record, $property);
  if (count($prop) == 0) {
    if ($insert_if_missing) {
      return chado_insert_property($record, $property);
    else {
      return FALSE;

  // Build the values array for checking if the CVterm exists.
  $type = array();
  if ($cv_id) {
    $type['cv_id'] = $cv_id;
  if ($cv_name) {
    $type['cv_id'] = array(
      'name' => $cv_name,
  if ($type_name) {
    $type['name'] = $type_name;
  if ($type_id) {
    $type['cvterm_id'] = $type_id;

  // Make sure the CV term exists;
  $options = array();
  $term = chado_select_record('cvterm', array('cvterm_id'), $type, $options);
  if (!$term or count($term) == 0) {
    tripal_report_error('tripal_core', TRIPAL_ERROR, "chado_update_property: " .
      "Cannot find the term described by: %property.", 
    array('%property' => print_r($property, TRUE)));
    return FALSE;
  if (count($term) > 1) {
    tripal_report_error('tripal_core', TRIPAL_ERROR, "chado_update_property: " .
      "Multiple terms found. Cannot add the property. Property was described " .
      "by: %property.", 
    array('%property' => print_r($property, TRUE)));
    return FALSE;

  // Get the foreign key for this property table
  $table_desc = chado_get_schema($base_table . 'prop');
  $fkcol = key($table_desc['foreign keys'][$base_table]['columns']);

  // construct the array that will match the exact record to update
  $match = array(
    $fkcol => $base_id,
    'type_id' => $type,
  // If we have the unique property_id, make sure to use it in the match to
  // ensure we get the exact record. Doesn't rely on there only being one
  // property of that type.
  if ($prop_id) {
    $property_pkey = $table_desc['primary key'][0];
    $match = array(
      $property_pkey => $prop_id,

  // Construct the array of values to be updated.
  $values = array();
  $values['value'] = $value;
  if ($rank) {
    $values['rank'] = $rank;

  // If we have the unique property_id then we can also update the type
  // thus add it to the values to be updated
  if ($prop_id) {
    $values['type_id'] = $type;

  return chado_update_record($base_table . 'prop', $match, $values);