排序依据和分组依据 Laravel

Order by and Group by with Laravel

在我当前的代码中,我将 groupBy 用于特定列,而且我想按 order_no 对每个数组进行排序。使用我当前的代码,我得到:

"Method Illuminate\Database\Eloquent\Collection::orderBy does not exist."

    $courses = CourseTopic::select([
        'course_topics.id',
        'course_topics.course_id',
        'course_topics.description',
        'course_topics.visible',
        'course_topics.name',
        'course_activities.order_no',
        'course_activities.activity_id',
        'activity_types.table_name'
    ])
    ->where('course_id', $course_id)
    ->leftJoin('course_activities', 'course_activities.course_topic_id', 'course_topics.id')
    ->leftJoin('activity_types', 'activity_types.id', 'course_activities.activity_type_id')
    ->get()
    ->groupBy('id')
    ->orderBy('course_activities.order_no');

您在 get() 之后有了它们,这意味着它现在是一个集合查询,不再是一个 QueryBuilder 对象。有两种选择:

将它移到 get() 之前,以便 MySQL 进行排序和分组:

$courses = CourseTopic::select([
    'course_topics.id',
    'course_topics.course_id',
    'course_topics.description',
    'course_topics.visible',
    'course_topics.name',
    'course_activities.order_no',
    'course_activities.activity_id',
    'activity_types.table_name'
])
->where('course_id', $course_id)
->leftJoin('course_activities', 'course_activities.course_topic_id', 'course_topics.id')
->leftJoin('activity_types', 'activity_types.id', 'course_activities.activity_type_id')
->groupBy('course_topics.id')
->orderBy('course_activities.order_no')
->get();

或者使用sortBy,也就是Collection方式。您需要使用返回的列名而不是 MySQL 关系

$courses = CourseTopic::select([
    'course_topics.id',
    'course_topics.course_id',
    'course_topics.description',
    'course_topics.visible',
    'course_topics.name',
    'course_activities.order_no',
    'course_activities.activity_id',
    'activity_types.table_name'
])
->where('course_id', $course_id)
->leftJoin('course_activities', 'course_activities.course_topic_id', 'course_topics.id')
->leftJoin('activity_types', 'activity_types.id', 'course_activities.activity_type_id')
->get()
->groupBy('id')
->sortBy('order_no');