diff --git a/src/Jenssegers/Mongodb/Eloquent/Model.php b/src/Jenssegers/Mongodb/Eloquent/Model.php index 86f8ef3b5..894ebe41a 100644 --- a/src/Jenssegers/Mongodb/Eloquent/Model.php +++ b/src/Jenssegers/Mongodb/Eloquent/Model.php @@ -11,6 +11,8 @@ use Jenssegers\Mongodb\Query\Builder as QueryBuilder; use MongoDB\BSON\ObjectID; use MongoDB\BSON\UTCDateTime; +use Illuminate\Contracts\Queue\QueueableEntity; +use Illuminate\Contracts\Queue\QueueableCollection; abstract class Model extends BaseModel { @@ -420,6 +422,52 @@ protected function removeTableFromKey($key) return $key; } + /** + * Get the queueable relationships for the entity. + * + * @return array + */ + public function getQueueableRelations() + { + $relations = []; + + foreach ($this->getRelationsWithoutParent() as $key => $relation) { + if (method_exists($this, $key)) { + $relations[] = $key; + } + + if ($relation instanceof QueueableCollection) { + foreach ($relation->getQueueableRelations() as $collectionValue) { + $relations[] = $key.'.'.$collectionValue; + } + } + + if ($relation instanceof QueueableEntity) { + foreach ($relation->getQueueableRelations() as $entityKey => $entityValue) { + $relations[] = $key.'.'.$entityValue; + } + } + } + + return array_unique($relations); + } + + /** + * Get loaded relations for the instance without parent. + * + * @return array + */ + protected function getRelationsWithoutParent() + { + $relations = $this->getRelations(); + + if ($parentRelation = $this->getParentRelation()) { + unset($relations[$parentRelation->getQualifiedForeignKeyName()]); + } + + return $relations; + } + /** * @inheritdoc */ diff --git a/src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php b/src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php index 35e14197d..a8f90544d 100644 --- a/src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php +++ b/src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php @@ -393,4 +393,14 @@ public static function getUpdateValues($array, $prepend = '') return $results; } + + /** + * Get the foreign key for the relationship. + * + * @return string + */ + public function getQualifiedForeignKeyName() + { + return $this->foreignKey; + } } diff --git a/tests/EmbeddedRelationsTest.php b/tests/EmbeddedRelationsTest.php index d602b0a71..5caae5b28 100644 --- a/tests/EmbeddedRelationsTest.php +++ b/tests/EmbeddedRelationsTest.php @@ -765,4 +765,23 @@ public function testPaginateEmbedsMany() $this->assertEquals(2, $results->count()); $this->assertEquals(3, $results->total()); } + + public function testGetQueueableRelationsEmbedsMany() + { + $user = User::create(['name' => 'John Doe']); + $user->addresses()->save(new Address(['city' => 'New York'])); + $user->addresses()->save(new Address(['city' => 'Paris'])); + + $this->assertEquals(['addresses'], $user->getQueueableRelations()); + $this->assertEquals([], $user->addresses->getQueueableRelations()); + } + + public function testGetQueueableRelationsEmbedsOne() + { + $user = User::create(['name' => 'John Doe']); + $user->father()->save(new User(['name' => 'Mark Doe'])); + + $this->assertEquals(['father'], $user->getQueueableRelations()); + $this->assertEquals([], $user->father->getQueueableRelations()); + } }