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->pk()) ? $this->_model->pk() : array($this->_model->pk()); // 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 Sprig_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 Sprig_Field_ManyToMany) { // ManyToMany fields also contain a pivot table $pivot = new Database_Table($field->through, $this->_db); // Get the columns associated with the first half $columns = $this->_columns(new Sprig_Field_BelongsTo(array('model' => $field->model)), $pivot); // Foreach column in the first half foreach ($columns as $column) { // Add it to the pivot table $pivot->add_column($column); } // Get the columns associated with the second half $columns = $this->_columns(new Sprig_Field_BelongsTo(array('model' => inflector::singular($this->_model->table()))), $pivot); // Foreach column in the second half foreach ($columns 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)); // 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; }