2015-05-09 156 views
0

首先,我将解释我的模型是如何创建的。我有3个模型老师,签名和资源在Laravel 5中创建与多对多关系的关系

一个资源belogs给老师和签名,签名和老师有多对多的关系。

老师有很多资源。 签名有许多资源。 老师有很多签名。 签名有许多教师 资源被授予老师,也属于签名。

这里是我的数据库结构:

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 例如在教师模型从给定签名 或签名让所有得到所有资源来自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
$teacher = Teacher::with(['signatures.resources'], ['resources'])->find($teacherId); 

这给你的老师与他的所有资源,所有他的签名,属于这些签名

教师模型中的所有资源得到所有资源从给定签名

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

on署名获得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(); 
+0

确定这要给我belogs到签名老师的资源。但例如我有这些资源: resource1 belogs签名1和teacher2。 resource2在签名2和教师2上签名。 当我打电话给 $ signatureId = signature1; $ teacherId = teacher2; Signature :: find($ signatureId) - > teachers() - > find($ teacherId) - > resources; 即将返回resource1和resource2,但resource2不会记录到签名1。 –

+0

好吧,我可以怎么把格式的评论? –

+0

检查我的编辑,这有道理吗? –