|
@@ -86,6 +86,51 @@ class Has_Many_And_Belongs_To extends Relationship {
|
|
|
return $this->insert_joining($joining);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Detach a record from the joining table of the association.
|
|
|
+ *
|
|
|
+ * @param int $ids
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public function detach($ids)
|
|
|
+ {
|
|
|
+ if ( ! is_array($ids)) $ids = array($ids);
|
|
|
+
|
|
|
+ return $this->pivot()->where_in($this->other_key(), $ids)->delete();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Sync the joining table with the array of given IDs.
|
|
|
+ *
|
|
|
+ * @param array $ids
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public function sync($ids)
|
|
|
+ {
|
|
|
+ $current = $this->pivot()->lists($this->other_key());
|
|
|
+
|
|
|
+ // First we need to attach any of the associated models that are not currently
|
|
|
+ // in the joining table. We'll spin through the given IDs, checking to see
|
|
|
+ // if they exist in the array of current ones, and if not we insert.
|
|
|
+ foreach ($ids as $id)
|
|
|
+ {
|
|
|
+ if ( ! in_array($id, $current))
|
|
|
+ {
|
|
|
+ $this->attach($id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Next we will take the difference of the current and given IDs and detach
|
|
|
+ // all of the entities that exists in the current array but are not in
|
|
|
+ // the array of IDs given to the method, finishing the sync.
|
|
|
+ $detach = array_diff($current, $ids);
|
|
|
+
|
|
|
+ if (count($detach) > 0)
|
|
|
+ {
|
|
|
+ $this->detach(array_diff($current, $ids));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Insert a new record for the association.
|
|
|
*
|
|
@@ -194,7 +239,7 @@ class Has_Many_And_Belongs_To extends Relationship {
|
|
|
$this->with = array_merge($this->with, array($foreign, $other));
|
|
|
|
|
|
// Since pivot tables may have extra information on them that the developer
|
|
|
- // needs, we allow an extra array of columns to be specified that will be
|
|
|
+ // needs we allow an extra array of columns to be specified that will be
|
|
|
// fetched from the pivot table and hydrate into the pivot model.
|
|
|
foreach ($this->with as $column)
|
|
|
{
|
|
@@ -269,9 +314,14 @@ class Has_Many_And_Belongs_To extends Relationship {
|
|
|
{
|
|
|
$foreign = $this->foreign_key();
|
|
|
|
|
|
+ // For each child we'll just get the parent that connects to the child and set the
|
|
|
+ // child model on the relationship array using the keys. Once we're done looping
|
|
|
+ // through the children all of the proper relations will be set.
|
|
|
foreach ($children as $key => $child)
|
|
|
{
|
|
|
- $parents[$child->pivot->$foreign]->relationships[$relationship][$child->{$child->key()}] = $child;
|
|
|
+ $parent =& $parents[$child->pivot->$foreign];
|
|
|
+
|
|
|
+ $parent->relationships[$relationship][$child->{$child->key()}] = $child;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -292,7 +342,7 @@ class Has_Many_And_Belongs_To extends Relationship {
|
|
|
|
|
|
// 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.
|
|
|
+ // from the model since it actually belongs to the pivot model.
|
|
|
foreach ($result->attributes as $key => $value)
|
|
|
{
|
|
|
if (starts_with($key, 'pivot_'))
|
|
@@ -322,9 +372,9 @@ class Has_Many_And_Belongs_To extends Relationship {
|
|
|
{
|
|
|
$columns = (is_array($columns)) ? $columns : func_get_args();
|
|
|
|
|
|
- // The "with" array contains a couple of columns by default, so we will
|
|
|
- // just merge in the developer specified columns here, and we'll make
|
|
|
- // sure the values of the array are unique.
|
|
|
+ // The "with" array contains a couple of columns by default, so we will just
|
|
|
+ // merge in the developer specified columns here, and we will make sure
|
|
|
+ // the values of the array are unique to avoid duplicates.
|
|
|
$this->with = array_unique(array_merge($this->with, $columns));
|
|
|
|
|
|
$this->set_select($this->foreign_key(), $this->other_key());
|