Browse Source

Add Table::addAssociations()

It allows setting multiple associations using a single function call
using an array argument and facilitates DRYer app code.
ADmad 11 years ago
parent
commit
85ed1db052
2 changed files with 84 additions and 0 deletions
  1. 41 0
      src/ORM/Table.php
  2. 43 0
      tests/TestCase/ORM/TableTest.php

+ 41 - 0
src/ORM/Table.php

@@ -565,6 +565,47 @@ class Table implements RepositoryInterface, EventListenerInterface {
 	}
 
 /**
+ * Setup associations.
+ *
+ * It takes an array containing set of table names indexed by association type
+ * as argument:
+ *
+ * {{{
+ * $this->Comment->associations([
+ * 		'belongsTo' => [
+ * 			'Comments',
+ * 			'Users' => ['className' => 'App\Model\Table\UsersTable']
+ * 		],
+ * 		'belongsToMany' => [
+ * 			'Tags'
+ * 		]
+ * ]);
+ * }}}
+ *
+ * @param array $params Set of associations to bind (indexed by association type)
+ * @return void
+ * @see \Cake\ORM\Table::belongsToMany()
+ * @see \Cake\ORM\Table::hasOne()
+ * @see \Cake\ORM\Table::hasMany()
+ * @see \Cake\ORM\Table::belongsToMany()
+ */
+	public function addAssociations(array $params) {
+		if ($params === null) {
+			return $this->_associations;
+		}
+
+		foreach ($params as $assocType => $tables) {
+			foreach ($tables as $associated => $options) {
+				if (is_numeric($associated)) {
+					$associated = $options;
+					$options = [];
+				}
+				$this->{$assocType}($associated, $options);
+			}
+		}
+	}
+
+/**
  * Creates a new BelongsTo association between this table and a target
  * table. A "belongs to" association is a N-1 relationship where this table
  * is the N side, and where there is a single associated record in the target

+ 43 - 0
tests/TestCase/ORM/TableTest.php

@@ -517,6 +517,49 @@ class TableTest extends TestCase {
 	}
 
 /**
+ * Test addAssociations()
+ *
+ * @return void
+ */
+	public function testAddAssociations() {
+		$params = [
+			'belongsTo' => [
+				'users' => ['foreignKey' => 'fake_id', 'conditions' => ['a' => 'b']]
+			],
+			'hasOne' => ['profiles'],
+			'hasMany' => ['authors'],
+			'belongsToMany' => [
+				'tags' => ['joinTable' => 'things_tags']
+			]
+		];
+
+		$table = new Table(['table' => 'dates']);
+		$table->addAssociations($params);
+
+		$associations = $table->associations();
+
+		$belongsTo = $associations->get('users');
+		$this->assertInstanceOf('\Cake\ORM\Association\BelongsTo', $belongsTo);
+		$this->assertEquals('users', $belongsTo->name());
+		$this->assertEquals('fake_id', $belongsTo->foreignKey());
+		$this->assertEquals(['a' => 'b'], $belongsTo->conditions());
+		$this->assertSame($table, $belongsTo->source());
+
+		$hasOne = $associations->get('profiles');
+		$this->assertInstanceOf('\Cake\ORM\Association\HasOne', $hasOne);
+		$this->assertEquals('profiles', $hasOne->name());
+
+		$hasMany = $associations->get('authors');
+		$this->assertInstanceOf('\Cake\ORM\Association\hasMany', $hasMany);
+		$this->assertEquals('authors', $hasMany->name());
+
+		$belongsToMany = $associations->get('tags');
+		$this->assertInstanceOf('\Cake\ORM\Association\BelongsToMany', $belongsToMany);
+		$this->assertEquals('tags', $belongsToMany->name());
+		$this->assertSame('things_tags', $belongsToMany->junction()->table());
+	}
+
+/**
  * Test basic multi row updates.
  *
  * @return void