protected function _tables() { // Prepare an array to hold tables $tables = array(); // Create a new database table with name and database $table = new Database_Table($this->_model->table(), $this->_db); // Get the model's primary keys as an array $model_pks = is_array($this->_model->primary_key()) ? $this->_model->primary_key() : array($this->_model->primary_key()); // Loop through each field within the model foreach ($this->_model->fields() as $field) { // Check if the field implaments the migratable field interface if ($field instanceof Jelly_Field_Migratable) { // Loop through each column in the field foreach ($field->columns() as $column) { // Add the column to the table $table->add_column($column); } } elseif ($field->in_db) { // If the field is unique if ($field->unique) { // Add a unique constraint to the table $table->add_constraint(new Database_Constraint_Unique($field->column)); } // Loop through every column in the model foreach ($this->_columns($field, $table) as $column) { // Add the column to the table $table->add_column($column); } } elseif ($field instanceof Jelly_Field_ManyToMany) { // ManyToMany fields also contain a pivot table $pivot = new Database_Table($field->through['model'], $this->_db); // Get fields $columns = $field->through['columns']; foreach ($columns as $field) { // Chekt if the field names are defaults if (strstr($field, ':')) { list($model, $field) = explode(':', $field); // Append the : back onto $field, it's key for recognizing the alias below $field = ':' . $field; // We should be able to find a valid meta object here if (FALSE == ($meta = Jelly::meta($model))) { throw new Kohana_Exception('Meta data for :model was not found while trying to resolve :field', array(':model' => $model, ':field' => $field)); } $field = $meta->foreign_key(); } $column = Database_Column::factory('int'); $column->auto_increment = FALSE; $column->name = $field; $cols[] = $column; } // Add to pivot foreach ($cols as $column) { // Add it to the pivot table $pivot->add_column($column); } // Add a primary key constraint on all fields within the pivot table $pivot->add_constraint(new Database_Constraint_Primary(array_keys($pivot->columns()), $pivot->name)); /** * @todo It would be more than appropriate to add a contstraint in a following * form into a database: ALTER TABLE `roles_users` ADD CONSTRAINT `roles_users_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, * */ // Add the pivot table to the list of tables $tables[] = $pivot; } } // Add the primary key constraints to the table $table->add_constraint(new Database_Constraint_Primary($model_pks, $table->name)); // Add the table to the list $tables[] = $table; // And return all tables. return $tables; }