Skip to content

Commit 8f9cdc2

Browse files
committed
Sprunjes should not use joins in filters
we need to be able to wrap custom filter methods in orWhere callbacks, but unfortunately this breaks the usage of joins within those filter methods
1 parent cecc4fe commit 8f9cdc2

2 files changed

Lines changed: 11 additions & 33 deletions

File tree

app/sprinkles/admin/src/Sprunje/ActivitySprunje.php

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,14 @@ class ActivitySprunje extends Sprunje
3535

3636
protected $name = 'activities';
3737

38-
/**
39-
* @var bool Keep track of whether the users table has already been joined on the query.
40-
*/
41-
protected $joinedUsers = false;
42-
4338
/**
4439
* Set the initial query used by your Sprunje.
4540
*/
4641
protected function baseQuery()
4742
{
4843
$query = $this->classMapper->createInstance('activity');
4944

50-
return $query;
45+
return $query->joinUser();
5146
}
5247

5348
/**
@@ -75,12 +70,6 @@ protected function applyTransformations($collection)
7570
*/
7671
protected function filterUser($query, $value)
7772
{
78-
if (!$this->joinedUsers) {
79-
$query = $query->joinUser();
80-
}
81-
82-
$this->joinedUsers = true;
83-
8473
// Split value on separator for OR queries
8574
$values = explode($this->orSeparator, $value);
8675
return $query->where(function ($query) use ($values) {
@@ -102,12 +91,6 @@ protected function filterUser($query, $value)
10291
*/
10392
protected function sortUser($query, $direction)
10493
{
105-
if (!$this->joinedUsers) {
106-
$query = $query->joinUser();
107-
}
108-
109-
$this->joinedUsers = true;
110-
11194
return $query->orderBy('users.last_name', $direction);
11295
}
11396
}

app/sprinkles/core/src/Sprunje/Sprunje.php

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,10 @@ protected function applyFilters()
267267
$e->addUserMessage('VALIDATE.SPRUNJE.BAD_FILTER', ['name' => $name]);
268268
throw $e;
269269
}
270-
// Set orFilter to 'false' to require a match on _all_ fields
271-
$this->query = $this->buildFilterQuery($this->query, $name, $value, false);
270+
// Since we want to match _all_ of the fields, we wrap the field callback in a 'where' callback
271+
$this->query = $this->query->where(function ($fieldQuery) use ($name, $value) {
272+
return $this->buildFilterQuery($fieldQuery, $name, $value);
273+
});
272274
}
273275

274276
return $this->query;
@@ -285,7 +287,10 @@ protected function filterAll($query, $value)
285287
{
286288
foreach ($this->filterable as $name) {
287289
if (studly_case($name) != 'all' && !in_array($name, $this->excludeForAll)) {
288-
$query = $this->buildFilterQuery($query, $name, $value, true);
290+
// Since we want to match _any_ of the fields, we wrap the field callback in a 'orWhere' callback
291+
$query = $query->orWhere(function ($fieldQuery) use ($name, $value) {
292+
return $this->buildFilterQuery($fieldQuery, $name, $value);
293+
});
289294
}
290295
}
291296

@@ -300,25 +305,15 @@ protected function filterAll($query, $value)
300305
* @param mixed $value
301306
* @return Builder
302307
*/
303-
protected function buildFilterQuery($query, $name, $value, $orFilter = true)
308+
protected function buildFilterQuery($query, $name, $value)
304309
{
305310
$methodName = 'filter'.studly_case($name);
306311

307312
// Determine if a custom filter method has been defined
308313
if (method_exists($this, $methodName)) {
309314
$query = $this->$methodName($query, $value);
310315
} else {
311-
if ($orFilter) {
312-
// Since we want to match _any_ of the fields, we wrap the field callback in a 'orWhere' callback
313-
$query = $query->orWhere(function ($fieldQuery) use ($name, $value) {
314-
return $this->buildFilterDefaultFieldQuery($fieldQuery, $name, $value);
315-
});
316-
} else {
317-
// Since we want to match _all_ of the fields, we wrap the field callback in a 'where' callback
318-
$query = $query->where(function ($fieldQuery) use ($name, $value) {
319-
return $this->buildFilterDefaultFieldQuery($fieldQuery, $name, $value);
320-
});
321-
}
316+
return $this->buildFilterDefaultFieldQuery($query, $name, $value);
322317
}
323318

324319
return $query;

0 commit comments

Comments
 (0)