2015-05-13 73 views
0

是否可以使用()或load()函數而不是模型對象的集合使用eloquent的方法來加載key =>值的數組?我只需要從關係一對夫婦的價值觀,並且不需要任何對象的功能,所以我真的不需要有可能在Laravel雄辯中預先加載數組而不是模型?

"relations" => [ 
    "relationship" => Collection() 
     "items" => [ 
      0 => Model() 
       "attributes" => ... 
       "table" => ... 
       "guarded" => ... 
       ...etc 
      1 => Model(), 
      ...etc 

的內存開銷,如果我能有更多的東西一樣

"relations" => [ 
    "relationship" => [ 
     "items" => [ 
      0 => [key => val, key => val ...], 
      1 => [key => val, key => val ...], 
      ...etc 

這可能嗎?甚至是使用一個基本的php對象而不是一個只需要幾個值就會產生瘋狂的開銷的Eloquent模型?我已經查看了API,並在構建查詢生成器對象時跨過了調用堆棧,並且我沒有看到任何明顯的方法來執行此操作,但我很好奇是否有人知道解決方法。

謝謝!

-Eric

+0

不是。但是,您可能可以使用[連接](http://laravel.com/docs/5.0/queries#joins)來獲取所需內容。 – lukasgeiter

+0

除非你正在加載成千上萬的記錄(甚至可能有數十萬) - 現實是你正在浪費你的時間。內存開銷不會對您的應用程序產生任何顯着影響。 – Laurence

+0

實際上,我加載了大量的記錄。很容易在數萬個範圍內,如果在某些情況下可能達到數千個範圍的100個,我不會感到驚訝。我遇到了內存溢出錯誤,迫使我把結果分成很小的塊,導致大量的查詢。我希望將這些切回基本數組可以讓我顯着增加我的塊大小。 – EpicWally

回答

0

約預先加載位扔我。這意味着,你想加載了一堆嵌套一堆模型中的模型,即:

// Returns 1000 Foo's with all their bars in two queries. 
Foo::take(1000)->with('bars')->get(); 

考慮您的問題更是創下了內存限制,我懷疑你真正想要調用預先加載這種方式。

直接訪問查詢生成器

我認爲你正在尋找一種方法來查詢的關係沒有保溼模型。您可以通過直接訪問查詢生成器來完成此操作。

$foo = Foo::find($id); 

// Returns hydrated models 
$bars = $foo->bars()->take(1000)->get(); 

// Returns raw data 
$bars = $foo->bars()->take(1000)->getQuery()->get(); 

默認預先加載

預先加載,可直接建立在模型上,造成一定的關係,始終與模型加載。

// Class Bar 
protected $with = ['awks']; 

如果是這種情況,1000條會自動加載所有的Awks。在你的情況下,會使事情成倍地惡化。這是一個令人愉快的媒介,它可以避免急切的加載嵌套關係,同時仍然有模型的優勢。

// Returns hydrated models without eager loading any relationships 
$bars = Foo::find($id)->bars()->take(1000)->getModels(); 
0

最終我想出了一個不同於我以前尋找的解決方案。由於我只真正需要加載關係的數據總和,因此我發現聚合可以被加載。

我的問題的一般要點是:我們有客戶。他們有客戶(債務人)。這些債務人的餘額是許多不同模型(付款,發票,信用票據以及其他一些)的總和。我希望能夠稱爲債務人 - >平衡,這將是所有這些事情的總和。做

$customer = Customer::find(###) 
foreach($customer->debtors as $debtor) 
{ 
    $debtor->balance(); 
} 

原來的解決方案,這促使這個問題時,這將是很容易做的硬編碼這個功能背後的餘額查詢,但後來我將運行到一個n + 1度的問題,是有平衡函數遍歷構成天平的所有組件,並將它們全部添加。因此,通過急切地加載所有這些組件,我可以在急切加載的情況下執行$ debtor-> balance()或$ customer-> debtor-> balance(),並且一切都很好。你可以看到,如果一個客戶有2000個債務人,而且這個債務人可能有幾十張發票,每個發票都有一個或多個付款,這就成爲一個巨大的數據量。通過將急切的負荷重新調整爲只加載一個總值,每個債務人只需要加載5個關係,每個關係都有一個單獨的項目,使其處於內存限制範圍內。