Browse Source

Adding auto detection of intermediate table names.

Signed-off-by: Taylor Otwell <taylorotwell@gmail.com>
Taylor Otwell 13 years ago
parent
commit
dc92dd264d

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

@@ -264,7 +264,7 @@ abstract class Model {
 	 * @param  string        $other
 	 * @return Relationship
 	 */
-	public function has_many_and_belongs_to($model, $table, $foreign = null, $other = null)
+	public function has_many_and_belongs_to($model, $table = null, $foreign = null, $other = null)
 	{
 		return new Has_Many_And_Belongs_To($this, $model, $table, $foreign, $other);
 	}

+ 17 - 1
laravel/database/eloquent/relationships/has_many_and_belongs_to.php

@@ -39,11 +39,27 @@ class Has_Many_And_Belongs_To extends Relationship {
 	{
 		$this->other = $other;
 
-		$this->joining = $table;
+		$this->joining = $table ?: $this->joining($model, $associated);
 
 		parent::__construct($model, $associated, $foreign);
 	}
 
+	/**
+	 * Determine the joining table name for the relationship.
+	 *
+	 * By default, the name is the models sorted and concatenated with an underscore.
+	 *
+	 * @return string
+	 */
+	protected function joining($model, $associated)
+	{
+		$models = array(class_basename($model), class_basename($associated));
+
+		sort($models);
+
+		return strtolower($models[0].'_'.$models[1]);
+	}
+
 	/**
 	 * Get the properly hydrated results for the relationship.
 	 *

+ 15 - 0
laravel/helpers.php

@@ -376,6 +376,21 @@ function root_namespace($class, $separator = '\\')
 	}
 }
 
+/**
+ * Get the "class basename" of a class or object.
+ *
+ * The basename is considered the name of the class minus all namespaces.
+ *
+ * @param  object|string  $class
+ * @return string
+ */
+function class_basename($class)
+{
+	if (is_object($class)) $class = get_class($class);
+
+	return basename($class);
+}
+
 /**
  * Return the value of the given item.
  *