Browse Source

Fix foreach error when useTable = false.

When calling model->create() with useTable = false, an error should not
be triggered.

Fixes #3480
mark_story 13 years ago
parent
commit
08cde9f5a2
2 changed files with 17 additions and 4 deletions
  1. 3 4
      lib/Cake/Model/Model.php
  2. 14 0
      lib/Cake/Test/Case/Model/ModelIntegrationTest.php

+ 3 - 4
lib/Cake/Model/Model.php

@@ -1304,10 +1304,8 @@ class Model extends Object implements CakeEventListener {
 		if ($this->useTable !== false && (!is_array($this->_schema) || $field === true)) {
 			$db = $this->getDataSource();
 			$db->cacheSources = ($this->cacheSources && $db->cacheSources);
-			if (method_exists($db, 'describe') && $this->useTable !== false) {
+			if (method_exists($db, 'describe')) {
 				$this->_schema = $db->describe($this);
-			} elseif ($this->useTable === false) {
-				$this->_schema = array();
 			}
 		}
 		if (is_string($field)) {
@@ -1477,7 +1475,8 @@ class Model extends Object implements CakeEventListener {
 		$this->validationErrors = array();
 
 		if ($data !== null && $data !== false) {
-			foreach ($this->schema() as $field => $properties) {
+			$schema = (array)$this->schema();
+			foreach ($schema as $field => $properties) {
 				if ($this->primaryKey !== $field && isset($properties['default']) && $properties['default'] !== '') {
 					$defaults[$field] = $properties['default'];
 				}

+ 14 - 0
lib/Cake/Test/Case/Model/ModelIntegrationTest.php

@@ -907,6 +907,20 @@ class ModelIntegrationTest extends BaseModelTest {
 	}
 
 /**
+ * Check schema() on a model with useTable = false;
+ *
+ * @return void
+ */
+	public function testSchemaUseTableFalse() {
+		$model = new TheVoid();
+		$result = $model->schema();
+		$this->assertNull($result);
+
+		$result = $model->create();
+		$this->assertEmpty($result);
+	}
+
+/**
  * data provider for time tests.
  *
  * @return array