Laravel - 检索直接/间接数据透视表订阅者

时间:2014-12-02 03:01:45

标签: laravel eloquent pivot-table

我很难在laravel中搞清楚这一点;对于订户关系,我们有2个数据透视表:

订阅者可以订阅问题:

question_subscriber
id   question_id  subscriber_id
1        2            3
2        2            4
3        3            1
4        3            2

订阅者可以订阅用户:

user_subscriber
id  user_id  subscriber_id
1      1         6
2      1         7
3      2         1

问题所有者的正常问题表:

questions
id  question  user_id
1     abc?       1
2     xyz?       1
3     123?       2

我们可以在他们的模型中正确设置数据透视关系,我可以使用foreach,问题的订阅者$question->subscribersQuestion as $subscriber或用户的订阅者$user->subscribersUser as $subscriber

但是,我们怎样才能拉出属于用户的所有订阅者(直接或间接(通过他们拥有的问题))?

例如,这些应该是user 1的所有检索订阅者:

6 // subscribed to directly
7 // subscribed to directly
3 // subscribed to through question
4 // subscribed to through question

有关Laravel最有效的方法吗?

1 个答案:

答案 0 :(得分:1)

这将是最简单的方法:

// assuming this setup: 
User hasMany Question
User belongsToMany User (subscribers - direct)
Question belongsToMany User (subscribers - indirect)

// we don't need this, since we pass it by reference to the closure,
// but for clarity let's initialize this variable:
$indirectSubscribers = null;

$user = User::with(['questions.subscribers' => function ($q) use (&$indirectSubscribers) {
  // get all indirect subscribers (cost of additional query)
  $indirectSubscribers = $q->get()->unique();
}])->find($userId);

// merge with directs subscribers
$allSubscribers = $user->subscribers->merge($indirectSubscribers);