Skip to content

Commit 48ac180

Browse files
committed
Tweaked embedsMany with more push/pull
1 parent a8feeb7 commit 48ac180

File tree

3 files changed

+41
-19
lines changed

3 files changed

+41
-19
lines changed

src/Jenssegers/Mongodb/Query/Builder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ protected function performUpdate($query, array $options = array())
640640
* @param mixed $id
641641
* @return mixed
642642
*/
643-
protected function convertKey($id)
643+
public function convertKey($id)
644644
{
645645
if (is_string($id) && strlen($id) === 24 && ctype_xdigit($id))
646646
{

src/Jenssegers/Mongodb/Relations/EmbedsMany.php

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ public function __construct(Builder $query, Model $parent, $localKey, $foreignKe
5555
*/
5656
public function addConstraints()
5757
{
58+
if (static::$constraints)
59+
{
60+
$this->query->where($this->parent->getKeyName(), '=', $this->parent->getKey());
61+
}
5862
}
5963

6064
/**
@@ -180,7 +184,7 @@ protected function performInsert(Model $model)
180184
$model->exists = true;
181185

182186
// Push the document to the database.
183-
$result = $this->parent->push($this->localKey, $model->getAttributes(), true);
187+
$result = $this->query->push($this->localKey, $model->getAttributes(), true);
184188

185189
// Get existing embedded documents.
186190
$documents = $this->getEmbedded();
@@ -209,13 +213,20 @@ protected function performUpdate(Model $model)
209213
$model->setUpdatedAt($time);
210214
}
211215

212-
$key = $model->getKey();
216+
// Convert the id to MongoId if necessary.
217+
$id = $this->query->getQuery()->convertKey($model->getKey());
213218

214-
$primaryKey = $model->getKeyName();
219+
// Update document in database.
220+
$result = $this->query->where($this->localKey . '.' . $model->getKeyName(), $id)
221+
->update(array($this->localKey . '.$' => $model->getAttributes()));
215222

216223
// Get existing embedded documents.
217224
$documents = $this->getEmbedded();
218225

226+
$primaryKey = $this->related->getKeyName();
227+
228+
$key = $model->getKey();
229+
219230
// Replace the document in the parent model.
220231
foreach ($documents as $i => $document)
221232
{
@@ -228,7 +239,7 @@ protected function performUpdate(Model $model)
228239

229240
$this->setEmbedded($documents);
230241

231-
return $this->parent->save() ? $model : false;
242+
return $result ? $model : false;
232243
}
233244

234245
/**
@@ -300,25 +311,33 @@ public function destroy($ids = array())
300311
// We'll return the numbers of affected rows when we do the deletes.
301312
$ids = (array) $ids;
302313

314+
$primaryKey = $this->related->getKeyName();
315+
316+
// Pull the documents from the database.
317+
foreach ($ids as $id)
318+
{
319+
// Convert the id to MongoId if necessary.
320+
$id = $this->query->getQuery()->convertKey($id);
321+
322+
$this->query->pull($this->localKey, array($primaryKey => $id));
323+
324+
$count++;
325+
}
326+
303327
// Get existing embedded documents.
304328
$documents = $this->getEmbedded();
305329

306-
$primaryKey = $this->related->getKeyName();
307-
308330
// Remove the document from the parent model.
309331
foreach ($documents as $i => $document)
310332
{
311333
if (in_array($document[$primaryKey], $ids))
312334
{
313335
unset($documents[$i]);
314-
$count++;
315336
}
316337
}
317338

318339
$this->setEmbedded($documents);
319340

320-
$this->parent->save();
321-
322341
return $count;
323342
}
324343

tests/RelationsTest.php

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public function tearDown()
1818
Photo::truncate();
1919
}
2020

21-
/*public function testHasMany()
21+
public function testHasMany()
2222
{
2323
$author = User::create(array('name' => 'George R. R. Martin'));
2424
Book::create(array('title' => 'A Game of Thrones', 'author_id' => $author->_id));
@@ -281,7 +281,7 @@ public function testMorph()
281281

282282
$photo = Photo::first();
283283
$this->assertEquals($photo->imageable->name, $user->name);
284-
}*/
284+
}
285285

286286
public function testEmbedsManySave()
287287
{
@@ -296,18 +296,21 @@ public function testEmbedsManySave()
296296

297297
$address = $user->addresses()->save(new Address(array('city' => 'Paris')));
298298

299-
$freshUser = User::find($user->_id);
300-
$this->assertEquals(array('London', 'Paris'), $freshUser->addresses->lists('city'));
299+
$user = User::find($user->_id);
300+
$this->assertEquals(array('London', 'Paris'), $user->addresses->lists('city'));
301301

302302
$address->city = 'New York';
303-
$freshUser->addresses()->save($address);
303+
$user->addresses()->save($address);
304304

305-
$this->assertEquals(2, count($freshUser->addresses));
306-
$this->assertEquals(2, count($freshUser->addresses()->get()));
307-
$this->assertEquals(2, $freshUser->addresses->count());
305+
$this->assertEquals(2, count($user->addresses));
306+
$this->assertEquals(2, count($user->addresses()->get()));
307+
$this->assertEquals(2, $user->addresses->count());
308+
$this->assertEquals(array('London', 'New York'), $user->addresses->lists('city'));
309+
310+
$freshUser = User::find($user->_id);
308311
$this->assertEquals(array('London', 'New York'), $freshUser->addresses->lists('city'));
309312

310-
$address = $freshUser->addresses->first();
313+
$address = $user->addresses->first();
311314
$this->assertEquals('London', $address->city);
312315
$this->assertInstanceOf('DateTime', $address->created_at);
313316
$this->assertInstanceOf('DateTime', $address->updated_at);

0 commit comments

Comments
 (0)