Skip to content

Commit 3b98a3f

Browse files
committed
PHPORM-209 Add query builder helper to set read preference
1 parent d6d8004 commit 3b98a3f

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

Diff for: src/Query/Builder.php

+32
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use MongoDB\Builder\Stage\FluentFactoryTrait;
2828
use MongoDB\Builder\Type\SearchOperatorInterface;
2929
use MongoDB\Driver\Cursor;
30+
use MongoDB\Driver\ReadPreference;
3031
use Override;
3132
use RuntimeException;
3233
use stdClass;
@@ -111,6 +112,8 @@ class Builder extends BaseBuilder
111112
*/
112113
public $hint;
113114

115+
private ReadPreference $readPreference;
116+
114117
/**
115118
* Custom options to add to the query.
116119
*
@@ -1493,6 +1496,31 @@ public function options(array $options)
14931496
return $this;
14941497
}
14951498

1499+
/**
1500+
* Set the read preference for the query
1501+
*
1502+
* @see https://www.php.net/manual/en/class.mongodb-driver-readpreference.php
1503+
*
1504+
* @param string $mode
1505+
* @param array $tagSets
1506+
* @param array $options
1507+
*
1508+
* @return $this
1509+
*/
1510+
public function readPreference(string $mode, ?array $tagSets = null, ?array $options = null): static
1511+
{
1512+
$this->readPreference = new ReadPreference($mode, $tagSets, $options);
1513+
1514+
return $this;
1515+
}
1516+
1517+
public function typeMap(array $typeMap): static
1518+
{
1519+
$this->options['typeMap'] = $typeMap;
1520+
1521+
return $this;
1522+
}
1523+
14961524
/**
14971525
* Performs a full-text search of the field or fields in an Atlas collection.
14981526
* NOTE: $search is only available for MongoDB Atlas clusters, and is not available for self-managed deployments.
@@ -1567,6 +1595,10 @@ private function inheritConnectionOptions(array $options = []): array
15671595
}
15681596
}
15691597

1598+
if (! isset($options['readPreference']) && isset($this->readPreference)) {
1599+
$options['readPreference'] = $this->readPreference;
1600+
}
1601+
15701602
return $options;
15711603
}
15721604

Diff for: tests/Query/BuilderTest.php

+21
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)