我正在使用以下查询从下表中获取匹配的ID,在这些表中,我只会得到student_id
。
有了这个student_id
,我必须从students
表中找到匹配的行,然后我要orderBy()
从students
表中找到键(例如名称)。
我建立了student_mapping
和student
模型之间的关系。
$mapps = Student_mapping::select('student_id');
if($request->session_id) {
$mapps = $mapps->where('session', '=', $request->session_id);
}
if($request->class_id) {
$mapps = $mapps->where('class_id', '=', $request->class_id);
if($request->group_id) {
$mapps = $mapps->where('group_id', '=', $request->group_id);
if($request->section_id) {
$mapps = $mapps->where('section_id', '=', $request->section_id);
}
}
}
$mapps = $mapps->get();
$students = [];
foreach($mapps as $map) {
if($map->student)
{
$students[] = Student::find($map->student_id);
}
}
我必须让$ students-> orderBy('name','ASC'),但是我不能这样做。
答案 0 :(得分:1)
您可以使用User::where('id', $map->student_id)->orderBy('name', 'ASC')
;这似乎没有用,因为id
仍然是唯一的。
另外,看起来您的代码将遭受多次对数据库的调用。
您可以将查询简化为:
$student_ids = $mapps->pluck('student_id');
$students = Student::whereIn('id', $student_ids)->orderBy('name', 'ASC')->get();
PS:雄辩的(模型)环绕QueryBuilder。参见example of ordering or groupby in the documentation
答案 1 :(得分:0)
获得这样的查询会更快,更好:
$students = Student::whereIn('id', $mapps)->orderBy('id')->get();
这将给您Collection
个应按ID排序的所有学生。如果希望将其作为数组,请记住在集合上调用->toArray()
方法,但无论哪种方式,它都应作为集合的目的。
答案 2 :(得分:0)
$students = [];
foreach($mapps as $map) {
if($map->student)
{
$students[] = Student::find($map->student_id);
}
}
通过laravel集合类see
return collect($student)->sortBy('name')->values()->all();