Это в значительной степени опирается (ну .. почти так же) на ответ, данный @ thisiskelvin
Пожалуйста, подпишите его вместо этого ответа (или обоих)
Я создал черту .. которую я назвал AdvancedModelLookup
в app\Traits
.
В этом я создал слегка измененную функцию из предоставленного кода:
<?
namespace App\Traits;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
trait AdvancedModelLookup
{
/**
* This run a query and orders the objects as per a provided array/collection.
*
* @param $query Builder
* @param $field
* @param $ids Collection|array
*
* @return Collection
*/
public static function getInOrder(Builder $query, string $field, $ids): Collection
{
$results = $query->whereIn($field, $ids)->get();
$reorder = collect([]);
foreach ($ids as $id) {
$reorder->push($results->where($field, $id)->first());
}
return $reorder;
}}
Теперь используйте эту черту:
use App\Traits\AdvancedModelLookup;
class SomeObject extends Model
{
use AdvancedModelLookup;
//...
}
Пример использования:
$order = [4,5,3];
$query = SomeObject::whereIn('id', $order);
$normal_lookup = $query->get();
$sorted_lookup = SomeObject::getInOrder($query, 'id', $order);
dd($normal_lookup, $sorted_lookup);
// Normal lookup order: 3,4,5
// Sorted lookup order: 4,5,3
Обратите внимание, вы можете легко расширить или создать дополнительные версии этого стиля функциональности, такие как pluck()
и т. Д. *
Эта черта позволяет быстро включить ее для каждой модели без необходимости связываться с наследованием объекта.