Lyman
Lyman

Reputation: 13

How to save values of an array to a table?

I have these codes on my add view

$status = array('0' => 'Resolved', '1' => 'Assigned/Unresolved', '2' => 'Suspended', '3' => 'Closed', '4' => 'Bypassed');
echo $this->Form->input('status', array('options' => $status));

and instead of saving the value (e.g. Resolved) to the table, it saves the index of the array. Any ideas?

Upvotes: 0

Views: 253

Answers (2)

Leo
Leo

Reputation: 1529

Can you not define the index as the value you want?

$status = array('Resolved' => 'Resolved', 'Assigned/Unresolved' => 'Assigned/Unresolved', etc etc );
    echo $this->Form->input('status', array('options' => $status));

Upvotes: 1

santiagobasulto
santiagobasulto

Reputation: 11726

You should do something like this:

$status = array('resolved' => 'Resolved', 'assigned' => 'Assigned/Unresolved'...);

It saves the index of the array. But this is not a good practice, instead try using enums. Check this out:

/**
     * Get Enum Values
     * Snippet v0.1.3
     * http://cakeforge.org/snippet/detail.php?type=snippet&id=112
     *
     * Gets the enum values for MySQL 4 and 5 to use in selectTag()
     */
    function getEnumValues($columnName=null, $respectDefault=false)
    {
        if ($columnName==null) { return array(); } //no field specified
        //Get the name of the table
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        $tableName = $db->fullTableName($this, false);


        //Get the values for the specified column (database and version specific, needs testing)
        $result = $this->query("SHOW COLUMNS FROM {$tableName} LIKE '{$columnName}'");

        //figure out where in the result our Types are (this varies between mysql versions)
        $types = null;
        if     ( isset( $result[0]['COLUMNS']['Type'] ) ) { $types = $result[0]['COLUMNS']['Type']; $default = $result[0]['COLUMNS']['Default']; } //MySQL 5
        elseif ( isset( $result[0][0]['Type'] ) )         { $types = $result[0][0]['Type']; $default = $result[0][0]['Default']; } //MySQL 4
        else   { return array(); } //types return not accounted for

        //Get the values
        $values = explode("','", preg_replace("/(enum)\('(.+?)'\)/","\\2", $types) );

        if($respectDefault){
                    $assoc_values = array("$default"=>Inflector::humanize($default));
                    foreach ( $values as $value ) {
                                    if($value==$default){ continue; }
                                    $assoc_values[$value] = Inflector::humanize($value);
                    }
        }
        else{
                    $assoc_values = array();
                    foreach ( $values as $value ) {
                                    $assoc_values[$value] = Inflector::humanize($value);
                    }
        }

        return $assoc_values;
    } //end getEnumValues

Paste that method in your AppModel.

Create the column in your table as an enum with the posible values, and use that method to get them.

Upvotes: 1

Related Questions