Laravel HasManyThrough, доступ к основным / вторичным рефералам пользователей - PullRequest
0 голосов
/ 23 октября 2018

У меня есть приложение, в котором мне нужно отслеживать первичных и вторичных рефералов пользователя.Моя таблица пользователей выглядит так:

таблица пользователей

  • name, varchar
  • email, 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'
    );
}

Однако мне не ясно, чтоключи / идентификаторы, которые я должен предоставить ... или, если это даже правильный бит для использования.Я пытался смешать, но я продолжаю получать ambiguous column name ошибок при использовании sqlite и других ошибок при использовании драйвера mysql.

UserA: {referer_id: null, referral_id: 'abc'}

UserB: {referrer_id: 'abc', referral_id: 'def'}

UserC: {referrer_id: 'def', referral_id: 'ghi'}

Я хочу иметь доступ к пользователю Cот пользователя A через реферальный код пользователя B.

1 Ответ

0 голосов
/ 23 октября 2018

Вы не можете использовать отношение HasManyThrough здесь, потому что нет способа указать псевдоним таблицы.

Вы можете использовать отношение primaryReferrals дважды:

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

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

// $user->secondaryReferrals
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...