Skip to content

Commit 4f84b71

Browse files
committed
Fix custom field orderby with legacy field data
1 parent b8c4417 commit 4f84b71

File tree

10 files changed

+43
-27
lines changed

10 files changed

+43
-27
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- Generic fieldtype passes `content_id` along to core fieldtype handler and triggers `pre_process` hook.
1313
- Error checking and handling for GraphQL compatible fieldtypes
1414
- Trigger `core_boot` hook during GraphQL requests
15+
- Custom field orderby clauses when it uses legacy field data storage
1516

1617
## [1.1.2] - 2023-07-27
1718

src/Models/Addon/Fluid/Data.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public function scopeCustomFields($query, $fields = null)
4242

4343
// Get a set of table names for fields that do not store data on the legacy table
4444
$fields = $fields->filter(function ($field) {
45-
return $field->legacy_field_data === 'n' || $field->legacy_field_data === false || $field->hasDataTable();
45+
return ! $field->hasLegacyFieldData() || $field->hasDataTable();
4646
});
4747

4848
// Join these extra field data tables

src/Models/Category/Category.php

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Expressionengine\Coilpack\FieldtypeManager;
66
use Expressionengine\Coilpack\Model;
7+
use Expressionengine\Coilpack\Models\Channel\ChannelData;
78
use Expressionengine\Coilpack\Models\Channel\ChannelEntry;
89
use Expressionengine\Coilpack\Models\FieldContent;
910

@@ -46,28 +47,30 @@ public function scopeOrderByCustomField($query, $field, $direction = 'asc')
4647
$field = $manager->getField($field, 'category');
4748
$column = "field_id_{$field->field_id}";
4849

49-
// If this field is not storing it's data on the category_field_data table we
50-
// will join the separate data table with a unique orderby_field_name alias
51-
if ($field->legacy_field_data === 'n' || $field->legacy_field_data === false) {
52-
$alias = "orderby_{$field->field_name}";
53-
$column = "$alias.$column";
54-
$this->scopeJoinFieldDataTable($query, $field, $alias);
55-
}
50+
// Setup our join for the appropriate channel data table and alias
51+
$alias = $field->hasLegacyFieldData() ? 'orderby_legacy_data' : "orderby_{$field->field_name}";
52+
$this->scopeJoinFieldDataTable($query, $field, $alias);
53+
$query->select($this->qualifyColumn('*'));
5654

57-
return $query->orderBy($column, $direction);
55+
return $query->orderBy("$alias.$column", $direction);
5856
}
5957

6058
public function scopeJoinFieldDataTable($query, $field, $alias = null)
6159
{
62-
if ($field->legacy_field_data == 'y' || $field->legacy_field_data === true) {
60+
// If we have already joined this table alias just do nothing
61+
$alreadyJoined = collect($query->getQuery()->joins)->pluck('table')->contains(function ($joinTable) use ($alias) {
62+
return strpos($joinTable, $alias) !== false;
63+
});
64+
65+
if ($alreadyJoined) {
6366
return $query;
6467
}
6568

66-
$table = $field->data_table_name;
69+
$table = $field->hasLegacyFieldData() ? (new ChannelData)->getTable() : $field->data_table_name;
6770
$joinTable = $alias ? "$table as $alias" : $table;
6871
$alias = $alias ?: $table;
6972
$query->leftJoin($joinTable, "$alias.cat_id", '=', $this->qualifyColumn('cat_id'));
70-
$query->select('*', $this->qualifyColumn('cat_id'));
73+
$query->select($this->qualifyColumn('*'));
7174

7275
return $query;
7376
}

src/Models/Category/CategoryData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function scopeCustomFields($query, $fields = null)
3232

3333
// Get a set of table names for fields that do not store data on the legacy table
3434
$fieldtypeTables = $fields->filter(function ($field) {
35-
return $field->legacy_field_data === 'n' || $field->legacy_field_data === false;
35+
return ! $field->hasLegacyFieldData();
3636
})->map(function ($field) {
3737
return $field->data_table_name;
3838
});

src/Models/Channel/ChannelData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function scopeCustomFields($query, $fields = null)
3232

3333
// Get a set of table names for fields that do not store data on the legacy table
3434
$fieldtypeTables = $fields->filter(function ($field) {
35-
return $field->legacy_field_data === 'n' || $field->legacy_field_data === false;
35+
return ! $field->hasLegacyFieldData();
3636
})->map(function ($field) {
3737
return $field->data_table_name;
3838
});

src/Models/Channel/ChannelEntry.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,28 +132,30 @@ public function scopeOrderByCustomField($query, $field, $direction = 'asc')
132132
$field = $manager->getField($field);
133133
$column = "field_id_{$field->field_id}";
134134

135-
// If this field is not storing it's data on the channel_data table we
136-
// will join the separate data table with a unique orderby_field_name alias
137-
if ($field->legacy_field_data === 'n' || $field->legacy_field_data === false) {
138-
$alias = "orderby_{$field->field_name}";
139-
$column = "$alias.$column";
140-
$this->scopeJoinFieldDataTable($query, $field, $alias);
141-
}
135+
// Setup our join for the appropriate channel data table and alias
136+
$alias = $field->hasLegacyFieldData() ? 'orderby_legacy_data' : "orderby_{$field->field_name}";
137+
$this->scopeJoinFieldDataTable($query, $field, $alias);
138+
$query->select($this->qualifyColumn('*'));
142139

143-
return $query->orderBy($column, $direction);
140+
return $query->orderBy("$alias.$column", $direction);
144141
}
145142

146143
public function scopeJoinFieldDataTable($query, $field, $alias = null)
147144
{
148-
if ($field->legacy_field_data == 'y' || $field->legacy_field_data === true) {
145+
// If we have already joined this table alias just do nothing
146+
$alreadyJoined = collect($query->getQuery()->joins)->pluck('table')->contains(function ($joinTable) use ($alias) {
147+
return strpos($joinTable, $alias) !== false;
148+
});
149+
150+
if ($alreadyJoined) {
149151
return $query;
150152
}
151153

152-
$table = $field->data_table_name;
154+
$table = $field->hasLegacyFieldData() ? (new ChannelData)->getTable() : $field->data_table_name;
153155
$joinTable = $alias ? "$table as $alias" : $table;
154156
$alias = $alias ?: $table;
155157
$query->leftJoin($joinTable, "$alias.entry_id", '=', $this->qualifyColumn('entry_id'));
156-
$query->select('*', $this->qualifyColumn('entry_id'));
158+
$query->select($this->qualifyColumn('*'));
157159

158160
return $query;
159161
}

src/Models/Channel/ChannelField.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,9 @@ public function getGraphType()
7575
{
7676
return $this->getFieldType()->getGraphType($this);
7777
}
78+
79+
public function hasLegacyFieldData()
80+
{
81+
return $this->legacy_field_data === 'y' || $this->legacy_field_data === true;
82+
}
7883
}

src/Models/Member/MemberData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public function scopeCustomFields($query, $fields = null)
3333

3434
// Get a set of table names for fields that do not store data on the legacy table
3535
$fieldtypeTables = $fields->filter(function ($field) {
36-
return $field->m_legacy_field_data === false || $field->m_legacy_field_data === 'n';
36+
return ! $field->hasLegacyFieldData();
3737
})->map(function ($field) {
3838
return $field->data_table_name;
3939
});

src/Models/Member/MemberField.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@ public function getDataTableNameAttribute($value)
3636
{
3737
return "member_data_field_{$this->m_field_id}";
3838
}
39+
40+
public function hasLegacyFieldData()
41+
{
42+
return $this->m_legacy_field_data === 'y' || $this->m_legacy_field_data === true;
43+
}
3944
}

src/Traits/DataAcrossTables.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public function scopeCustomFields($query, $fields = null)
2020

2121
// Get a set of table names for fields that do not store data on the legacy table
2222
$fieldtypeTables = $fields->filter(function ($field) {
23-
return $field->legacy_field_data === 'n' || $field->legacy_field_data === false;
23+
return ! $field->hasLegacyFieldData();
2424
})->map(function ($field) {
2525
return $field->data_table_name;
2626
});

0 commit comments

Comments
 (0)