在Laravel Eloquent中访问数据透视表“第三模型关系”

时间:2018-06-02 21:16:33

标签: php laravel eloquent pivot

我有这种多对多的关系Laravel Eloquent关系 模型是:

class Email extends Model //actually represent the email account
{
    protected $table = 'emails';

    protected $fillable = [
        'user_id',
        'name',
    ];

    public function messages() {
       return $this->belongsToMany(Message::class)->withPivot('email_subtype_id');
    }
}

class Message extends Model //actually represent the email message
{
    protected $table = 'messages';

    protected $fillable = [
        'subject',
        'body ',
    ];

    public function emails() {
        return $this->belongsToMany(Email::class)->withPivot('email_subtype_id');
    }
}

class EmailMessage extends Pivot //actually represent the pivot table
{
    protected $table = 'email_message';

    protected $fillable = [
        'email_id',
        'message_id',
        'email_subtype_id',
    ];

    public function email() {
        return $this->belongsTo(Email::class);
    }

    public function message() {
        return $this->belongsTo(Message::class);
    }

    //this is the relation to a third model called EmailSubtype
    //I want to include this relation to the Pivot when using it
    public function subtype() {
        return $this->belongsTo(EmailSubtype::class, 'email_subtype_id');
    }
}

class EmailSubtype extends Model //3rd Model need to be included with Pivot
{
    protected $table = 'email_subtypes';

    protected $fillable = [
        'name'
    ];

    public function pivotEmailSubtype(){
        return $this->hasMany(Pivot::class, 'email_subtype_id');
    }
}

我可以在Controller中执行此操作:

    $email = Email::find(1);

    foreach($email->messages as $message) {
        $subtype_id = $message->pivot->email_subtype_id;
        dd($subtype_id); //1 that relates to subtype: CC Email Account
        //also I can get the name indirectly away from the relation as follows:
        $subtypeName = EmailSubtype::find($subtype_id)->first()->name;
        dd($subtypeName);
    }

这里我只通过直接枢轴关系获取email_subtype_id,但必须做额外的工作才能获得相关的电子邮件子类型名称。

我需要从第3个模型EmailSubtype关系中获取电子邮件子类型名称[直接] oneToMany [hasMany和belongsTo],它与使用EmailSubtype模型的Pivot模型有关:

$message->pivot->subtypeName;

请帮忙!

1 个答案:

答案 0 :(得分:1)

使用此:

public function messages() {
   return $this->belongsToMany(Message::class)->withPivot('email_subtype_id') 
       ->using(EmailMessage::class);
}

$message->pivot->subtype->name