在Laravel 5中创建多对多关系的关系

时间:2015-05-09 01:29:00

标签: orm eloquent laravel-5 relation

首先,我将解释我的模型是如何创建的。我有3个模型教师,签名和资源

教师的资源和签名,签名和教师有很多关系。

老师有很多资源。 Signature有很多资源。 老师有很多签名。 签名有很多教师 资源与教师相似,也属于签名。

这是我的数据库结构:

    Teachers
        id
        name

    Signature
        id
        name
        dsescription

    Resources
        id
        name
        path
        teacher_id
        signature_id

    signature_teacher //table from many to many relation doesn't have a model related to it
        id
        signature_id
        teacher_id

现在我想从teacher_id和signature_id获取资源 例如,在教师模型上获取给定签名的所有资源 或者在Signature上获得ginven老师的所有资源。

我尝试使用模型中的一对多关系,但这可以让我从教师那里获得所有资源,或者从签名中获取所有资源,但不是教师的资源和签名。

class Resource extends Model {
    public teacher(){
        return $this->belongsTo('APP\Teacher');
    }
    public signature(){
        return $this->belongsTo('APP\Signature');
    }

}


class Teacher extends Model {

    public function signatures(){
        return $this->belongsToMany('App\Signature');
    }

    public function resources() {
        return $this->hasMany('App\Resource'); //return all resources from a teacher
    // how can i get the resources with a given signature
    }

}


class Signature extends Model {

    public function teachers(){
        return $this->belongsToMany('App\Teacher')
    }

    public function resources()
    {
        return $this->hasMany('App\Resource'); //return all resources from a signature
    //how can i get all the resources with a given teacher?
    }

}

1 个答案:

答案 0 :(得分:1)

$teacher = Teacher::with(['signatures.resources'], ['resources'])->find($teacherId);

这可以为教师提供他所有的资源,所有签名以及属于这些签名的所有资源

教师模型上的

获取给定签名的所有资源

Teacher::find($teacherId)->signatures()->find($signatureId)->resources;
Signature上的

从ginven老师那里获取所有资源

Signature::find($signatureId)->teachers()->find($teacherId)->resources;

修改

$resources = Resource::whereHas('teacher', function($q)
{
    $q->where('id', $teacherId);

})
->whereHas('signature', function($q)
{
    $q->where('id', $signatureId);

})->get();