2014-12-02 81 views
0

我很難找到laravel;對於用戶的關係,我們有2個透視表:Laravel - 檢索直接/間接數據透視表訂戶

一個用戶可以訂閱一個問題:

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 

主軸關係在他們的mod中正確設置ELS,我可以拉出來在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

這將是最簡單的方法:

// 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); 
+0

嗯..你能解釋一下使用(..)和什麼查詢語法是幹什麼的?它按照你的說法工作,但增加了4個查詢。我開始認爲最好也許把它們全部放在一張帶有用戶或問題標誌的表格中,這樣查詢/分頁/等將變得更容易。我不確定是否最好在這種情況下使用多態關係,並創建新的模型訂戶。你的想法和建議非常感謝。 – Wonka 2014-12-03 23:42:42

+0

'&'表示傳遞[reference](http://php.net/manual/en/language.references.php)以便在閉包中寫入變量。這個不添加4個查詢,只有1個('$ q-> get()'部分)。然而總共有5個查詢(用戶,用戶,訂戶,問題,questions.subscribers x 2)。不確定你指的是什麼查詢語法? – 2014-12-04 00:03:59

+0

明白了 - 我不完全理解它是如何工作的; $ user =之後的所有內容似乎都很混亂。通過語法,我指的是'['questions.subscribers'=> function($ q)use(&$ indirectSubscribers){獲取所有間接訂戶(額外查詢的成本) $ indirectSubscribers = $ q-> get ) - >獨特的(); ($ userId) - > paginate(2);} find($ userId)' – Wonka 2014-12-04 01:11:10