2014-08-29 46 views
0

因此,我几天前开始学习laravel,现在我有了雄辩的ORM问题。Laravel通过另一个表格的列获取项目

我有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表中创建新行,然后增加列total为每个新等。我之所以这样做,是因为我需要根据今天,本周和本月的每个链接有多少喜欢进行过滤。所以,我不知道如何在Eloquent ORM中做到这一点。随着加载看起来是不可能的,因为有2个不同的查询,我需要类似于JOINS的东西在1个查询中使用这两个表。

我当前的查询:

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

任何想法,我可怎么办呢?

对不起,我的英语。谢谢。

编辑

在SQL查询应类似于:

SELECT * FROM链接为ln LEFT JOIN喜欢AS LK ON ln.id = lk.link_id WHERE lk.created_at BETWEEN “2014年8月28日9时52分58秒”和 “2014年8月29日9时52分58秒” ORDER BY lk.total

+0

[这里](http://laravel.com/docs/eloquent#relationship)可能会帮助你 – 2014-08-29 08:57:17

+0

我已经使用了一对多的关系。 – gintko 2014-08-29 09:16:41

回答

0

好的,我用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); 

也有另一种方式,你可以使用 - >分页,但我不认为这是一个很好的使用它:

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

林不知道这是否会工作,但它是一个尝试;

对于天

$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列将与该值覆盖喜欢id列。为了解决这个问题,请在select()或get()内选择要使用的数据。

+0

如果我只需要显示有多少人喜欢今天/本周/本月的链接,那么您的示例很好,但我还需要订购所有链接。 – gintko 2014-08-29 09:43:00

+0

你需要什么来订购它们,你可以在分页之前添加 - > orderBy('column')到链中? – 2014-08-29 09:44:07

+0

总喜欢或SUM(赞) – gintko 2014-08-29 09:55:46

相关问题