【问题标题】:Create a relation to a many to many relation in Laravel 5在 Laravel 5 中创建与多对多关系的关系
【发布时间】:2015-05-09 01:28:59
【问题描述】:

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

A Resource 属于 Teacher AND 也是 Signature,并且 Signature 和 Teacher 具有多对多关系。

老师有很多资源。 签名有很多资源。 老师有很多签名。 Signatures有很多老师 资源属于教师,也属于签名。

这是我的数据库结构:

    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?
    }

}

【问题讨论】:

    标签: orm eloquent laravel-5 relation


    【解决方案1】:
    $teacher = Teacher::with(['signatures.resources'], ['resources'])->find($teacherId);
    

    这为您提供了老师的所有资源、他的所有签名以及属于这些签名的所有资源

    在教师模型上从给定签名中获取所有资源

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

    在签名上从 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();
    

    【讨论】:

    • 好的,这会给我一个属于签名的老师的资源。但例如我有这些资源:resource1 属于signature1 和teacher2。 resource2 隶属于 signature2 和 teacher2。当我调用 $signatureId = signature1; $teacherId = 老师2;签名::find($signatureId)->teachers()->find($teacherId)->resources;这将返回资源 1 和资源 2,但资源 2 不属于签名 1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2013-09-05
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多