2017-03-21 37 views
0

我試圖實現類似於Laravel的hasManyThrough,但我不確定我的數據庫設置得當,或者我只是錯過了一些東西。試圖實現一個hasManyThrough類型的關係

我想顯示一個管理員頁面來顯示我們支持的所有網站。我想要一個簡單的專欄,顯示每個網站附加了多少客戶的獨特計數。爲此,我打算通過orders表並檢索distinct用戶列表,然後在我的視圖中簡單使用->count()方法。

這是我的DB設置(簡化):

sites表(主鍵: 'ID'):

id | ... 

users表(主鍵: 'ID'):

id | first_name | last_name | ... 

orders表(主鍵:'訂單'):

id | order | user_id | site_id | .... 

Site型號:

public function customers() 
{ 
    return $this->hasManyThrough('App\User', 'App\Order', 'site_id', ' id')->distinct(); 
} 

我意識到的時候了,我的DB設置和文件之間的主要區別是我沒有一個order_id在我users表,但它沒有任何意義,我因爲用戶可以有很多訂單。

值得注意的是:我也有一個表user_orders。我不確定是否應該使用它。 user_orders具有以下設置:

id | user_id | order 

你可以看到,它只是一箇中間表來保存用戶和訂單之間的連接(記得order是訂單的PK,沒有ID)。

那麼,任何人都可以幫助我理解我做錯了什麼嗎?

+0

爲什麼不選擇從訂單表中計數,並通過user_id和site_id來區分不同? – TheFallen

+0

這引發了另一個問題,我如何將該查詢與我傳遞我的視圖的集合配對?因爲在我看來,我正在循環集合來創建錶行。 – Mark

+0

你只需要數字?數據庫查詢將返回一個數組或類似的東西,你可以循環。 – TheFallen

回答

0

你可以通過加入逃脫。我給你這個示例代碼來指導你

public function customers() 
{ 
    return $this->hasMany('App\Order') 
    ->leftjoin('users', 'users.id', 'orders.user_id') 
    ->groupBy('users.id'); //Is this needed? 

    //Above code will return you a collection of Order though, but with the user data. 
    //Let's try using the User model 
    return App\User::whereHas('orders', function($query) use ($this->id) { 
     $query->where('site_id', $this->id); 
    })->get(); 
}