在雄辩的关系laravel中转换查询

时间:2016-03-30 08:59:30

标签: php mysql database laravel eloquent

我有5个表studentsteacherssubjectsstudent_subjectsubject_teacher 学生与学科有多对多的关系同样的老师与学科有很多关系。

学生表

id | name | email

教师表

id | name | email

科目表

id | name 

subject_teacher表:

id | teacher_id | subject_id

student_subject表:

id | student_id | subject_id

以上是我的数据库结构在Student,Teacher,Subject的模型中,我定义了多对多的关系。 因此,如果我想获得老师的主题,我只需Teacher::find(1)->subjects()->get()。在我目前的数据库结构中,我没有学生和老师之间的直接关系,但我希望得到所有老师的学生,我可以用查询这样做

 Student::join('student_subject', 'students.id', '=', 'student_subject.student_id')
 ->join('subject_teacher', 'student_subject.subject_id', '=', 'subject_teacher.subject_id')
 ->where('subject_teacher.teacher_id', '=',1)
  ->groupBy('students.name');

我的问题我不想要查询我想用滔滔不绝的方式做我想做的事我会改变我的关系请帮帮我

注意:我不想更改我的数据库结构。我知道如果查询有可能,那么肯定会有雄辩的。

2 个答案:

答案 0 :(得分:0)

您无需更改表格的结构即可使用Eloquent。您所需要的只是创建Eloquent模型和defime关系。所以,我们首先为studentsteacherssubjects创建模型。

学生模特

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model {

    public function subjects()
    {
        return $this->belongsToMany(Subject::class);
    }

}

教师模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Teacher extends Model {

    public function subjects()
    {
        return $this->belongsToMany(Subject::class);
    }

}

主题模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Subject extends Model {

    public function students()
    {
        return $this->belongsToMany(Student::class);
    }

    public function teachers()
    {
        return $this->belongsToMany(Teacher::class);
    }

}

现在你可以使用这样的东西:

// Get all students with related subjects
$studentsWithSubjects = \App\Student::with('subjects')->get();

// Get student with id 1 with related subjects
$student1WithSubjects = \App\Student::with('subjects')->find(1);

Teacher模型使用相同的规则。希望有助于您入门。

更新

好吧,如果你想在Teacher和...之间建立联系。使用Student关系的many-to-many模型然后您需要使用id,'student_id'和teacher_id创建另一个数据透视表,然后在Teacher中定义关系方法和Student模型,因此您可以使用双方的关系方法,例如:

// In Student Model
public function teachers()
{
    return $this->belongsToMany(Teacher::class);
}

// In Teacher Model
public function students()
{
    return $this->belongsToMany(Student::class);
}

所以现在你可以使用这样的东西:

$teacher1WithStudents = \App\Teacher::with('students')->find(1);
$student1WithTeachers = \App\Student::with('teachers')->find(1);

答案 1 :(得分:0)

我想首先重新构建问题:

有老师在某些科目上课。 有些学生就某些科目上课。

学生的老师是老师,他们会为学生提供课程。

教师的学生是学生上课的老师。

如果这是正确的,我建议您使用预先加载。

举个例子,让学生获得身份证1:

$student = App\Students::with(['subjects.teachers'])->find(1)->get();

然后你可以做一个foreach on

$student->subjects

每个科目都会得到老师。

  

<强>注意!如果每位教师只有一个科目,则使用属于且有很多关系。

当您获得关于预先加载的一般概念时,您可以在预先加载的查询上使用一些其他查询约束来直接获得所需内容。

点击此处的热切加载部分:https://laravel.com/docs/5.2/eloquent-relationships#querying-relations