簡體   English   中英

Laravel通過另一個表的列獲取項目

[英]Laravel get items by another table's column

因此,我幾天前開始學習laravel,現在我對雄辯的ORM遇到了問題。

我有2張桌子:

Links:
╔════╦═══════╗
║ Id ║ Name  ║
╠════╬═══════╣
║ 1  ║ test  ║
║ 2  ║ test2 ║
╚════╩═══════╝

Likes:
╔════╦═════════╦═══════╦══════════════════╗
║ Id ║ link_id ║ total ║ created_at       ║
╠════╬═════════╬═══════╬══════════════════╣
║ 1  ║ 1       ║ 5     ║ 2014.08.27 11:32 ║
║ 2  ║ 2       ║ 10    ║ 2014.08.29 07:07 ║
╚════╩═════════╩═══════╩══════════════════╝

每天我都會在likes表中創建新行,然后為每個新Like增加列total 之所以這樣做,是因為我需要按今天,本周和本月的每個鏈接過濾多少個喜歡的對象。 因此,我不知道如何在雄辯的ORM中執行此操作。 急切的加載看起來是不可能的,因為有2個不同的查詢,所以我需要類似於JOINS的東西才能在1個查詢中使用兩個表。

我當前的查詢:

$links = Link::with('likes')->paginate(10);

有什么想法,我該怎么做?

對不起我的英語不好。 謝謝。

編輯

SQL中的查詢應類似於:

SELECT * FROM鏈接AS ln左聯接喜歡AS lk ON ln.id = lk.link_id WHERE lk.created_at在'2014-08-28 09:52:58'和'2014-08-29 09:52:58'排序按總數

我不確定這是否行得通,但可以嘗試;

好幾天

$days = Link::leftJoin('likes', 'likes.id', '=', 'links.id')
->whereBetween('likes.created_at', array(Carbon::now()->subDay(), Carbon::now()))
->orderBy(likes.total)->get();

幾個月

$months = Link::leftJoin('likes', 'likes.id', '=', 'links.id')
->whereBetween('likes.created_at', array(Carbon::now()->subMonth(), Carbon::now()))
->orderBy('likes.total')->get();

數周

$months = Link::leftJoin('likes', 'likes.id', '=', 'links.id')
->whereBetween('likes.created_at', array(Carbon::now()->subWeek(), Carbon::now()))
->orderBy('likes.total')->get();

問題在於,“鏈接”的id列將被Likes id列中的值覆蓋。 為了克服這個問題,請在select()或get()中選擇要使用的數據。

好的,我找到了使用groupBy的解決方案,當然,現在我不能使用-> paginate,但是我可以手動進行設置,因此這不是一個大問題。

我有點likes表,但現在我使用COUNT而不是SUM,但它應該同時適用於兩者。

return self::select('links.*')
            ->addSelect(DB::raw("COUNT(`likes`.`id`) AS `total_likes`"))
            ->join('likes', 'likes.link_id', '=', 'links.id')
            ->whereBetween('likes.created_at', array($start, $end))
            ->groupBy('likes.link_id')
            ->orderBy('total_likes', 'DESC')
            ->take($limit);

還有另一種可以使用-> paginate的方法,但是我認為使用它不是一個好方法:

$links = Link::select('*')
                ->addSelect(DB::raw("(SELECT COUNT(`likes`.`id`) FROM `likes` WHERE `likes`.`link_id` = `links`.`id` AND `likes`.`created_at` BETWEEN '$start' AND '$end')  AS `total_likes`"))
                ->orderBy('total_likes', 'DESC')
                ->whereHas('likes', function($query) use ($start, $end) {
                    $query->whereBetween('created_at', array($start, $end));
                })->paginate(15);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM