Browse Source

Added "pivot" method to has_many_and_belongs_to.

Taylor Otwell 12 years ago
parent
commit
453d4154f2

+ 1 - 1
laravel/database/eloquent/query.php

@@ -136,7 +136,7 @@ class Query {
 		// any pivot columns that are on the model.
 		if ($this instanceof Relationships\Has_Many_And_Belongs_To)
 		{
-			$this->pivot($models);
+			$this->hydrate_pivot($models);
 		}
 
 		return $models;

+ 23 - 9
laravel/database/eloquent/relationships/has_many_and_belongs_to.php

@@ -108,9 +108,11 @@ class Has_Many_And_Belongs_To extends Relationship {
 		// If the insert was successful, we'll insert a record into the joining table
 		// using the new ID that was just inserted into the related table, allowing
 		// the developer to not worry about maintaining the join table.
-		if ($model instanceof Model and is_numeric($id = $model->get_key()))
+		if ($model instanceof Model)
 		{
-			$result = $this->insert_joining(array_merge($this->join_record($id), $joining));
+			$joining = array_merge($this->join_record($id), $joining);
+
+			$result = $this->insert_joining($joining);
 		}
 
 		return $model instanceof Model and $result;
@@ -279,7 +281,7 @@ class Has_Many_And_Belongs_To extends Relationship {
 	 * @param  array  $results
 	 * @return void
 	 */
-	protected function pivot(&$results)
+	protected function hydrate_pivot(&$results)
 	{
 		foreach ($results as &$result)
 		{
@@ -288,17 +290,19 @@ class Has_Many_And_Belongs_To extends Relationship {
 			// the pivot table that may need to be accessed by the developer.
 			$pivot = new Pivot($this->joining);
 
+			$attributes = array_filter($result->attributes, function($attribute)
+			{
+				return starts_with($attribute, 'pivot_');
+			});
+
 			// If the attribute key starts with "pivot_", we know this is a column on
 			// the pivot table, so we will move it to the Pivot model and purge it
 			// from the model since it actually belongs to the pivot.
-			foreach ($result->attributes as $key => $value)
+			foreach ($attributes as $key => $value)
 			{
-				if (starts_with($key, 'pivot_'))
-				{
-					$pivot->{substr($key, 6)} = $value;
+				$pivot->{substr($key, 6)} = $value;
 
-					$result->purge($key);
-				}
+				$result->purge($key);
 			}
 
 			// Once we have completed hydrating the pivot model instance, we'll set
@@ -330,6 +334,16 @@ class Has_Many_And_Belongs_To extends Relationship {
 		return $this;
 	}
 
+	/**
+	 * Get a model instance of the pivot table for the relationship.
+	 *
+	 * @return Pivot
+	 */
+	public function pivot()
+	{
+		return new Pivot($this->joining);
+	}
+
 	/**
 	 * Get the other or associated key for the relationship.
 	 *