2015-10-13 191 views
1

通過構建股票投資組合應用程序學習Laravel。爲用戶,賬戶,股票,期權和交易提供模型。我相信我有正確的關係。Laravel 5.1查詢關係

問題是我如何獲得用戶 - >帳戶 - >交易。我確信我可以在查詢構建器中做一些事情,但我希望能有更多的「雄辯」方法。

用戶

public function accounts() 
{ 
    return $this->hasMany('App\Account'); 
} 

public function stocks() 
{ 
    return $this->belongsToMany('App\Stock'); 
} 

public function options() 
{ 
    return $this->belongsToMany('App\Option'); 
} 

public function transactions() 
{ 
    return $this->hasMany('App\Transaction'); 
} 

帳戶

class Account extends Model 
{ 
    protected $fillable = 
    [ 
     'name', 
     'broker' 

    ]; 

    public function user() 
    { 
     return $this->belongsTo('App\User'); 
    } 

    public function stocks() 
    { 
     return $this->belongsToMany('App\Stock'); 
    } 

    public function options() 
    { 
     return $this->belongsToMany('App\Option'); 
    } 

    public function transactions() 
    { 
     return $this->hasMany('App\Transaction'); 
    } 

交易

class Transaction extends Model 
{ 
    protected $fillable = 
    [ 
     'type', 
     'account_id', 
     'transaction_date', 
     'quantity', 
     'stock_id', 
     'option_id', 
     'amount', 
     'description' 

    ]; 


    public function user() 
    { 
     return $this->belongsTo('App\User'); 
    } 

    public function stock() 
    { 
     return $this->belongsTo('App\Stock'); 
    } 

    public function option() 
    { 
     return $this->belongsTo('App\Option'); 
    } 

    public function account() 
    { 
     return $this->belongsTo('App\Account'); 
    } 

    public function accounts() 
    { 
     return $this->hasManyThrough('App\Account', 'App\User'); 
    } 
} 

最後,我想我要尋找每個總額帳戶的用戶可以擁有。 (用戶可以有很多賬戶,每個賬戶都有很多交易,股票和期權。)

感謝您的幫助,或者至少讓我知道我是否會走向正確的道路!

+1

好像查詢生成器的方法是要走的路。否則,您將最終將每個「Transaction」對象加載到內存中,而您真正需要的只是每個帳戶的總值。 – alexw

+0

我有點害怕。這個想法是讓一個頁面列出所有用戶單獨的賬戶和一個餘額,然後點擊賬戶打開列出所有交易的頁面。同一個特定的股票。您可以看到一個用戶的股票總量,然後按賬戶分割,然後在每個個人賬戶中分離涉及該股票的交易清單。 – BrioDev

回答

2

如果$user爲用戶對象,然後$user->accounts口若懸河車型

集合

您可以加載所有帳戶以及它們與預先加載的交易:

$user->load([ 
    'accounts', 
    'accounts.transactions', 
]); 

$user->accounts->transactions是不是你可以這樣做,因爲「交易」是關於每個個人Account對象,而不是集合的帳戶對象。

foreach ($user->accounts as $account) { 
    // do something with $account->transactions; 
} 

我強烈不建議這樣做,因爲@alexw在他的評論中提到的,雄辯的對象是相當大的,並且具有X多X許多是:通過這樣每個賬戶獲得的交易你會循環您要加載到內存中的指數級大量數據。但一般來說,這就是你如何獲得關係的關係。

你最好不要使用查詢生成器

的好消息是關係可以使查詢很容易!例如,你可以做這樣的事情,而不是:

注:在Laravel 5.2,該lists方法已被替換pluck

$user->load(['accounts']); 

foreach ($user->accounts as $account) { 
    $amounts = $account->transactions()->lists('amount'); 
    $total = $amounts->sum(); 

    // - or - 

    $query = $account->transactions() 
     ->select(\DB::raw('SUM(amount) AS total')) 
     ->first(); 
    $total = $query->total; 
} 
+0

謝謝你們的幫助。我會採納你的建議。你給出的最後一個例子返回了總數並向我展示瞭如何去做。只要我理解了這個過程,如果我要使用急切的加載示例,它是否只爲該用戶加載所有數據?或加載所有用戶及其交易,然後過濾掉請求的用戶。我的觀點是,如果它只是返回一個用戶,那麼數據可能不會那麼大,但如果它將所有用戶放入內存中,那麼就會將請求的用戶抽出來,這肯定會很大。再次感謝你們! – BrioDev

+0

@BrioDev它只是加載該用戶的數據。你說它「可能不是那麼大」,但總是想到長期和邊緣情況。也許從現在開始2年,*將*成爲大量數據,即使只是一個用戶。或者,也許你有一個用戶誰做了一些淫穢的交易。 – andrewtweber

+0

絕對正確。非常感謝你。我的下一個山區是學習React,並將用它來更新價格和排序視圖等等。我認爲可能將所有數據發送給它,因爲一個塊可能是要走的路,然後讓它將所有東西排除在外意見去了。更小的JSON我相信會更容易管理。還有很多東西要學習,很高興知道有像你這樣的人願意幫助!非常感謝。 – BrioDev