Вы можете попробовать настройки отношения, которая возвращает результаты в порядке, для которого вы ищете. Вы все равно должны иметь возможность загружать отношения и иметь результаты в указанном порядке. Это все предполагается, что поле item_order
является разделенным запятыми строковым списком идентификаторов.
public function itemsOrdered()
{
/**
* Adds conditions to the original 'items' relationship. Due to the
* join, we must specify to only select the fields for the related
* table. Then, order by the results of the FIND_IN_SET function.
*/
return $this->items()
->select('checklist_items.*')
->join('checklists', 'checklist_items.checklist_id', '=', 'checklists.id')
->orderByRaw('FIND_IN_SET(checklist_items.id, checklists.item_order)');
}
Или, если вы не хотите, чтобы жёстко в таблицы/поля:
public function itemsOrdered()
{
$orderField = 'item_order';
$relation = $this->items();
$parentTable = $relation->getParent()->getTable();
$related = $relation->getRelated();
$relatedTable = $related->getTable();
return $relation
->select($relatedTable.'.*')
->join($parentTable, $relation->getForeignKey(), '=', $relation->getQualifiedParentKeyName())
->orderByRaw('FIND_IN_SET('.$related->getQualifiedKeyName().', '.$parentTable.'.'.$orderField.')');
}
Теперь вы можете:
$list = Checklist::with('items', 'itemsOrdered')->first();
var_export($list->item_order);
var_export($list->items->lists('id'));
var_export($list->itemsOrdered->lists('id'));
Просто предупреждение: это достаточно экспериментальный код , Он работает с небольшим количеством тестовых данных, которые мне доступны, но я не сделал ничего подобного в производственной среде. Кроме того, это проверяется только на отношения HasMany. Если вы попробуете этот точный код на BelongsToMany или что-нибудь в этом роде, у вас появятся проблемы.
Я не знаю, как вы это сделаете в laravel, но я знаю, что в прямом запросе mysql, если вы хотите что-то упорядоченное по заранее определенному порядку, вы можете использовать 'field' или' find_in_set' как часть ваш заказ и просто перечисление ценностей в любом порядке. Или вы можете использовать оператор case в select (или order), который возвращает числа и порядок в этом столбце. Если у laravel нет другого пути, единственный способ, которым я могу думать, - хранить элементы в массиве и использовать их массив, чтобы получить желаемый порядок. –
@Matthew Brown '$ list-> item_order' упорядочен массив элементов ids ?? – voodoo417
@ voodoo417 да, это правильно –