三重枢轴挑战

时间:2015-12-21 11:27:00

标签: php laravel laravel-5

我遇到了以下挑战,尝试在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。

代码很麻烦而且无法正常工作。 谢谢你的帮助

目标: 在学期中检索课堂上的学生。教室,学生和学期之间有多对多的关系。

2 个答案:

答案 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();
}