我遇到了以下挑战,尝试在Laravel 5中加入3个表:
我在3个表:学生,教室,术语之间有多对多的关系。我很乐意打电话给term->classroom->students
。
我看到了Eloquent-triple-pivot软件包,但不幸的是,我无法让Laravel 5工作。
拜托,我会很感激解决方案绑定这个并打电话,雄辩或其他。
谢谢。
修改:
我在3个表之间有多对多关系;教室,学生,学期。
我有3个数据透视表:classroom_term,classroom_student,student_term。
和3个相应的模型:ClassroomTerm,ClassroomStudent,StudentTerm。
我的课堂模型:
public function students()
{
return $this->belongsToMany('App\Student')->withTimestamps();
}
public function terms()
{
return $this->belongsToMany('App\Term')->withTimestamps();
}
我的期限型号:
public function classrooms()
{
return $this->belongsToMany('App\Classroom')->withTimestamps();
}
public function students()
{
return $this->belongsToMany('App\Student')->withTimestamps();
}
我的学生模型:
public function terms()
{
return $this->belongsToMany('App\Term')->withTimestamps();
}
public function classrooms()
{
return $this->belongsToMany('App\Classroom')->withTimestamps();
}
我在 StudentsController 中所做的是
$term = Term::findOrFail($id);
foreach($term->classrooms as $classroom) {
$studentids = ClassroomStudent::where('classroom_id', '=', $classroom->id)->get();
}
//to get the real student collection
foreach($studentids->student_id as $studentid){
$students = Student::findOrFail($studentid)
}
return view('students.list')->with(['students' => $students]);
在我的 students.list 视图中,我只想检索学生:
@foreach($students as $student)
First Name: {{!!$student->first_name!!}}
@endforeach
错误在这一行:
foreach($studentids->student_id as $studentid){
$students = Student::findOrFail($studentid)
}
Undefined property: Illuminate\Database\Eloquent\Collection::$student_id'
但是dd($ studentids)返回了一个数组,其中一个属性是student_id。
代码很麻烦而且无法正常工作。 谢谢你的帮助
目标: 在学期中检索课堂上的学生。教室,学生和学期之间有多对多的关系。
答案 0 :(得分:-1)
多对多关系返回一个数组,它在定义sudentids时仍然会执行->get()
也只返回一个数组->first()
不会返回一个数组但是你没有得到所有学生。
变量不会自动转入数组,使foreach仅返回最后一个值。
因此,要正确地从学生那里返回值,您很可能会得到类似的东西。
控制器:
// Or even bind the term to the url
$term = Term::findOrFail($id);
return view('students.list',compact("term"));
查看:
<!-- You could even remove the classroom name/list around it if you purely want to display all students under the term -->
<li>
@foreach($term->classrooms as $classroom) {
<ul>
Classroom: {{ $classroom->name }}
<li>
@foreach($classroom->students as $student)
<ul>
First name: {{ $student->first_name }}
</ul>
@endforeach
</li>
</ul>
@endforeach
</li>
在一个学期下返回所有学生的另一种简单方法是在查询中使用 - &gt; whereHas()这样就足够了
控制器:
$students = Student::whereHas("classrooms",function($q){
$q->whereHas("terms",function($q){
$q->where("id",$termId);
});
})->get();
return view('students.lists',compact("students"));
查看:
<li>
@foreach($students as $student)
<ul>
First name: {{ $student->first_name }}
</ul>
@endforeach
</li>
如果您希望返回一个学期内的特定课堂,或者甚至是两个以下的用户,您应该为每个课程创建一个3个控制器(如果您不想单独显示学生,则只需2个)并将您的课堂嵌套在条款下只需输入/terms/1/classrooms/2/
即可获得合适的课堂,或/terms/1/classrooms
输入所有课堂。
答案 1 :(得分:-1)
我认为你可能不能很好地建立关系。试着好好考虑一下,例如,我认为可能是学生 public function students()
{
return $this->hasMany('App\Student')->withTimestamps();
}
public function terms()
{
return $this->belongsTo('App\Term')->withTimestamps();
}
一个课堂。
public function classrooms()
{
return $this->hasMany('App\Classroom')->withTimestamps();
}
public function classrooms()
{
return $this->belongsTo('App\Classroom')->withTimestamps();
}
const string ns = "http://schemas.microsoft.com/2003/10/Serialization/Arrays";
const string prefix = "d3p1";
using(var writer = XmlWriter.Create("file.xml"))
{
writer.WriteStartElement("Messages");
writer.WriteAttributeString("xmlns", prefix, null, ns);
writer.WriteElementString(prefix, "string", ns, "my message");
writer.WriteEndElement();
}