Laravel HasManyThrough,访问主要/次要用户推荐

时间:2018-10-23 17:45:32

标签: mysql laravel orm eloquent

我有一个应用程序,需要跟踪用户的主要推荐人和次要推荐人。我的用户表如下:

用户表

  • 名称,varchar
  • 电子邮件,varchar
  • referral_id ,varchar
  • referrer_id ,varchar

我目前使用以下方式访问主要推荐人/推荐人:

public function referrer() 
{
    return $this->belongsTo(User::class, 'referrer_id', 'referral_id');
}

public function primaryReferrals() 
{
    return $this->hasMany(User::class, 'referrer_id', 'referral_id');
}

例如,我试图弄清楚如何访问“二级”引荐。

用户A邀请用户B。然后,用户B邀请用户D,E,F。从用户A模型中,我希望能够调用$user->secondaryReferrals之类的东西并获得用户D,E,F。

我猜我需要使用类似的东西:

public function secondaryReferrals() 
{
    return $this->hasManyThrough(
        User::class, 
        User::class, 
        'referrer_id', 
        'referrer_id', 
        'referral_id', 
        'referral_id'
    );
}

但是我不清楚我应该提供什么键/标识...或者这是否是正确的选择。我尝试了混合,但使用sqlite时出现ambiguous column name错误,而使用mysql驱动程序时却出现其他错误。

UserA:{   Referer_id:null,   referral_id:“ abc” }

UserB:{   Referrer_id:“ abc”,   referral_id:“ def” }

UserC:{   Referrer_id:“ def”,   referral_id:“ ghi” }

我希望能够通过用户B的推荐代​​码从用户A访问用户C。

1 个答案:

答案 0 :(得分:0)

您不能在这里使用HasManyThrough关系,因为无法指定表别名。

您可以两次使用primaryReferrals关系:

public function getSecondaryReferralsAttribute() 
{
    $this->load('primaryReferrals.primaryReferrals');

    return $this->primaryReferrals->pluck('primaryReferrals')->flatten();
}

// $user->secondaryReferrals