Skip to content

Commit bbf14b0

Browse files
committed
PHPORM-209 Add query builder helper to set read preference
1 parent 8829052 commit bbf14b0

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/Query/Builder.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use MongoDB\Builder\Type\QueryInterface;
2929
use MongoDB\Builder\Type\SearchOperatorInterface;
3030
use MongoDB\Driver\Cursor;
31+
use MongoDB\Driver\ReadPreference;
3132
use Override;
3233
use RuntimeException;
3334
use stdClass;
@@ -113,6 +114,8 @@ class Builder extends BaseBuilder
113114
*/
114115
public $hint;
115116

117+
private ReadPreference $readPreference;
118+
116119
/**
117120
* Custom options to add to the query.
118121
*
@@ -1534,6 +1537,31 @@ public function options(array $options)
15341537
return $this;
15351538
}
15361539

1540+
/**
1541+
* Set the read preference for the query
1542+
*
1543+
* @see https://www.php.net/manual/en/class.mongodb-driver-readpreference.php
1544+
*
1545+
* @param string $mode
1546+
* @param array $tagSets
1547+
* @param array $options
1548+
*
1549+
* @return $this
1550+
*/
1551+
public function readPreference(string $mode, ?array $tagSets = null, ?array $options = null): static
1552+
{
1553+
$this->readPreference = new ReadPreference($mode, $tagSets, $options);
1554+
1555+
return $this;
1556+
}
1557+
1558+
public function typeMap(array $typeMap): static
1559+
{
1560+
$this->options['typeMap'] = $typeMap;
1561+
1562+
return $this;
1563+
}
1564+
15371565
/**
15381566
* Performs a full-text search of the field or fields in an Atlas collection.
15391567
* NOTE: $search is only available for MongoDB Atlas clusters, and is not available for self-managed deployments.
@@ -1642,6 +1670,10 @@ private function inheritConnectionOptions(array $options = []): array
16421670
}
16431671
}
16441672

1673+
if (! isset($options['readPreference']) && isset($this->readPreference)) {
1674+
$options['readPreference'] = $this->readPreference;
1675+
}
1676+
16451677
return $options;
16461678
}
16471679

tests/Query/BuilderTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Mockery as m;
1616
use MongoDB\BSON\Regex;
1717
use MongoDB\BSON\UTCDateTime;
18+
use MongoDB\Driver\ReadPreference;
1819
use MongoDB\Laravel\Connection;
1920
use MongoDB\Laravel\Query\Builder;
2021
use MongoDB\Laravel\Query\Grammar;
@@ -1416,6 +1417,26 @@ function (Builder $elemMatchQuery): void {
14161417
['find' => [['embedded._id' => 1], []]],
14171418
fn (Builder $builder) => $builder->where('embedded->id', 1),
14181419
];
1420+
1421+
yield 'options' => [
1422+
['find' => [[], ['comment' => 'hello']]],
1423+
fn (Builder $builder) => $builder->options(['comment' => 'hello']),
1424+
];
1425+
1426+
yield 'readPreference' => [
1427+
['find' => [[], ['readPreference' => new ReadPreference(ReadPreference::SECONDARY_PREFERRED)]]],
1428+
fn (Builder $builder) => $builder->readPreference(ReadPreference::SECONDARY_PREFERRED),
1429+
];
1430+
1431+
yield 'readPreference advanced' => [
1432+
['find' => [[], ['readPreference' => new ReadPreference(ReadPreference::NEAREST, [['dc' => 'ny']], ['maxStalenessSeconds' => 120])]]],
1433+
fn (Builder $builder) => $builder->readPreference(ReadPreference::NEAREST, [['dc' => 'ny']], ['maxStalenessSeconds' => 120]),
1434+
];
1435+
1436+
yield 'hint' => [
1437+
['find' => [[], ['hint' => ['foo' => 1]]]],
1438+
fn (Builder $builder) => $builder->hint(['foo' => 1]),
1439+
];
14191440
}
14201441

14211442
#[DataProvider('provideExceptions')]

0 commit comments

Comments
 (0)