Laravel通过另一张表获取项目';s列


Laravel get items by another table's column

所以,我几天前开始学习laravel,现在我对雄辩的ORM有问题。

我有两张桌子:

链接:╔════╦═══════╗║Id║名称║╠════╬═══════╣║1.║测验║║2.║测试2║╚════╩═══════╝喜欢:╔════╦═════════╦═══════╦══════════════════╗║Id║链接id║全部的║创建日期║╠════╬═════════╬═══════╬══════════════════╣║1.║1.║5.║2014.08.27 11:32║║2.║2.║10║2014.08.29 07:07║╚════╩═════════╩═══════╩══════════════════╝

每天我都在likes表中创建新行,然后为每个新的类增加列total。我之所以这么做,是因为我需要根据今天、本周和本月每个链接的点赞数进行过滤。所以,我不知道如何在Eloquent ORM中做到这一点。由于有两个不同的查询,所以急切加载看起来是不可能的,我需要类似于JOIN的东西来在一个查询中使用这两个表。

我当前的查询:

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

有什么想法吗,我该怎么做?

对不起我的英语。谢谢

编辑

SQL中的查询应该类似于:

从链接中选择*In LEFT JOIN赞为ln.id上的lk=lk.link_id其中lk.created_at介于"2014-08-28 09:52:58"和'2014-08-29 09:52:58'按lk.订单总

我不确定这是否可行,但这是一次尝试;

$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();

这样做的问题是Links中的id列将被likes id列中的值覆盖。要克服这个问题,请在select()或get()中选择要使用的数据。

好的,我使用groupBy找到了解决方案,当然现在我不能使用->分页,但我可以手动进行,所以这不是一个大问题。

我稍微更改了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);

还有另一种方法可以使用->分页,但我认为使用它不好:

$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);