|
4 | 4 |
|
5 | 5 | use Expressionengine\Coilpack\FieldtypeManager; |
6 | 6 | use Expressionengine\Coilpack\Model; |
| 7 | +use Expressionengine\Coilpack\Models\Channel\ChannelData; |
7 | 8 | use Expressionengine\Coilpack\Models\Channel\ChannelEntry; |
8 | 9 | use Expressionengine\Coilpack\Models\FieldContent; |
9 | 10 |
|
@@ -46,28 +47,30 @@ public function scopeOrderByCustomField($query, $field, $direction = 'asc') |
46 | 47 | $field = $manager->getField($field, 'category'); |
47 | 48 | $column = "field_id_{$field->field_id}"; |
48 | 49 |
|
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('*')); |
56 | 54 |
|
57 | | - return $query->orderBy($column, $direction); |
| 55 | + return $query->orderBy("$alias.$column", $direction); |
58 | 56 | } |
59 | 57 |
|
60 | 58 | public function scopeJoinFieldDataTable($query, $field, $alias = null) |
61 | 59 | { |
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) { |
63 | 66 | return $query; |
64 | 67 | } |
65 | 68 |
|
66 | | - $table = $field->data_table_name; |
| 69 | + $table = $field->hasLegacyFieldData() ? (new ChannelData)->getTable() : $field->data_table_name; |
67 | 70 | $joinTable = $alias ? "$table as $alias" : $table; |
68 | 71 | $alias = $alias ?: $table; |
69 | 72 | $query->leftJoin($joinTable, "$alias.cat_id", '=', $this->qualifyColumn('cat_id')); |
70 | | - $query->select('*', $this->qualifyColumn('cat_id')); |
| 73 | + $query->select($this->qualifyColumn('*')); |
71 | 74 |
|
72 | 75 | return $query; |
73 | 76 | } |
|
0 commit comments