Home > other >  Order and Sub Order collection - laravel 7 (Simple)
Order and Sub Order collection - laravel 7 (Simple)

Time:03-02

lets say I have a collection of users Users::all()

I would like to take sort/order it like such Users::all()->sort('created_at', 'DESC')

then I would like to sub order it by an array like [1,5,3,9,4,8] so perhpas a call like this Users::all()->sort('created_at', 'DESC')->sortBy("id", [1,5,3,9,4,8])

Any Advice?

Edit 1

I have found this, is this correct to use?

$ids = collect([1,5,3,9,4,8]);
$users = Users::all()->sort('created_at', 'DESC');
$users = $ids->map(function($id) use($users) {
    return $users->where('cat_id', $id)->first();
});

CodePudding user response:

I think you could just invoke orderBy() twice.

$ids = [1,5,3,9,4,8];
$users = Users::all()
                ->orderBy('created_at', 'desc')
                ->orderBy($ids)
                ->get();

Does this answer your question?

CodePudding user response:

You can use whereIn like this probably:

$ids = [1,5,3,9,4,8];

$users = Users::all()
                ->orderBy('created_at', 'desc')
                ->whereIn('cat_id', $ids)
                ->get();

https://laravel.com/docs/9.x/queries#additional-where-clauses

The whereIn method verifies that a given column's value is contained within the given array

CodePudding user response:

So I found a solution.

        $ids = json_decode($interview->question_ids ?? '[]');
        if(count($ids) == 0){ // if empty create new id array and save to DB
            $ids = collect(questions::all()->where('interview_id', $interview->id)->pluck('id')->toArray());
            $interview->question_ids = json_encode($ids);
            $interview->save();
        }
        $questions = questions::all()->where('interview_id', $interview->id)->sortBy([
            ['order_timestamp', 'asc'],
            ['created_at', 'asc'],
        ]);
        $questions = $ids->map(function($id) use($questions) {
            return $questions->where('id', $id)->first();
        });
        $questions = $questions->flatten();
  • Related