2015-02-23 84 views
0

我正嘗試基於相關模型中定義的方法的結果對雄辯ORM調用進行排序。我使用Laravel 5.根據相關模型中方法的結果訂購雄辯ORM結果集

我想要的posts的列表,包括職位authorlocationcommentscounts(這是viewsupvotesdownvotes某職位的數量)。我希望列表按hotness排序,這不是db中的字段(函數的結果)。

\App\Counts模型中,我們有一個稱爲hotness()

此方法的方法進行上類似於書籤交易算法的算法的計算[參見以下詳細說明]

我有一個鋒ORM呼叫:

$posts = \App\Post::with('author') 
    ->with('location.city') 
    ->with('comments') 
    ->with('counts') 
    ->paginate(20); 

\App\Counts模型包含upvotes領域,downvotesviews,以及用於在其他一些變量計算帖子的熱度。

我可以在我的模型這樣的重寫toArray()方法hotness值添加到分頁當從counts模型回來(飛)數組:

public function toArray() 
{ 
    $array = parent::toArray(); 
    $array['hotness'] = $this->hotness(); 
    return $array; 
} 

雖然這是有用的它自己的權利,我無法實現我的目標,這是排序ORM分頁結果每個職位hotness評級。

有沒有什麼辦法可以實現這個沒有有一個cron遍歷所有帖子並計算hotness每個帖子每x分鐘?

我非常希望能夠只需添加

->orderBy('hotness') 

->orderBy('counts.hotness') 

,但我有一種感覺,這也許是不可能的。

圍繞如何解決這個問題的任何創意點子?


辣味算法參考

enter image description here

T是當柱被做了第一柱的日期的網站

x是上之間的秒數upvotes的數量減去downvotes的數量

y-1如果x < 0,如果x = 0和如果x > 0

zx絕對值和1

+0

嘗試根據您在'Post'模型下的要求覆蓋'orderBy'函數。 – 2015-02-23 16:37:11

回答

0

看來,我正在尋找的功能不可實現。

我最終堅持hotnesscounts表並更新覆蓋toArray()方法的值。

這使我->orderBy('counts.hotness')

爲了開銷我使用使得我不計算每個時間的counts模型被轉換爲陣列hotness 15分鐘後過期緩存鍵減輕。

我在15分鐘內解決了這個問題,因爲這使得hotness足以滿足本應用的需求。