2017-06-19 81 views
0

我有一个网站的图像,和图像可以有标签。许多图像也可以具有相同的标签。所以2张图片可以有标签“绘画”。Laravel/SQL按人气/趋势排序

我有一个images表,一个tags表和一个images_tag数据透视表。

images_tag表具有列:idimages_idtag_idcreated_at

我想要的是能够基本上找到哪些标签趋势,例如在过去的72小时内。

这意味着我想有一个查询,发生在过去72小时

$trendingTags = ImagesTag::where('created_at', '>=', Carbon::now()->subHours(72)) 

使用的所有标签和需要,比方说,前3名最常用的标签。所以在这种情况下,

$trendingTags = ImagesTag::where('created_at', '>=', Carbon::now()->subHours(72)) 
->orderBy('tag_id most frequently used', 'desc') 
->take(3); 

我该怎么做这项工作?

编辑:

针对FUBAR的回答,我试过如下:

控制器:

$trendingTags = Tag::selectRaw('tags.*, COUNT(image_tag.id) AS count') 
->join('image_tag', 'tags.id', '=', 'image_tag.tag_id') 
->where('created_at', '>=', Carbon::now()->subHours(72)) 
->orderBy('count', 'desc') 
->take(3); 

return view('home') 
>with('trendingTags', $trendingTags) 

这给我的错误:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'commendme.image_tag' doesn't exist (SQL: select count(*) as aggregate from tags inner join image_tag on tags . id = image_tag . tag_id where created_at >= 2017-06-16 02:44:02 order by count desc limit 3)

所以我尝试切换代码以反映images_ta摹表(而不是IMAGE_TAG,我猜是FUBAR的部分错字),我得到了另一个错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'count' in 'order clause' (SQL: select count(*) as aggregate from tags inner join images_tag on tags . id = images_tag . tag_id where created_at >= 2017-06-16 02:45:15 order by count desc limit 3) (View: C:\xampp\htdocs\series\commend-me\CommendMe\resources\views\home.blade.php)

编辑2:尝试FUBAR最后的编辑后

新的错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'image_count' in 'order clause' (SQL: select count(*) as aggregate from tags inner join images_tag on tags . id = images_tag . tag_id where created_at >= 2017-06-16 02:55:17 group by tags . id order by image_count desc limit 3) (View: C:\xampp\htdocs\series\commend-me\CommendMe\resources\views\home.blade.php)

回答

3

我从你的解释猜你真正想要的Tag模型本身,而不是枢轴数据。

如果是这样,那么你就需要加入tags表到image_tag表,再算上imagestags表之间的关系数量。一旦你有这个价值,只需按顺序。

$trendingTags = Tag::selectRaw('tags.*, COUNT(images_tag.id) AS image_count') 
    ->join('images_tag', 'tags.id', '=', 'images_tag.tag_id') 
    ->where('images_tag.created_at', '>=', Carbon::now()->subHours(72)) 
    ->groupBy('tags.id') 
    ->orderBy('image_count', 'desc') 
    ->take(3) 
    ->get(); 

编辑

针对张贴OP的错误。

我注意到我引用的连接表实际上被称为images_tag,而不是image_tag。 OP,命名数据透视表时,按字母顺序使用关系的单数名称是Laravel标准。然而,我修改了我的答案。

我还注意到我错过了重要的groupBy声明,这是SQL聚合器函数所要求的声明。

最后,我已将count更名为image_count,以防MySQL认为这是保留字。

编辑#2

我只是在我的项目之一进行了测试,它的工作如预期。

$categories = FaqCategory::selectRaw('faq_categories.*, COUNT(faq_faq_category.id) AS faq_count') 
    ->join('faq_faq_category', 'faq_categories.id', '=', 'faq_faq_category.faq_category_id') 
    ->groupBy('faq_categories.id') 
    ->orderBy('faq_count', 'desc') 
    ->take(3) 
    ->get(); 
+0

感谢您的回答。不幸的是你的代码给了我一些错误。我编辑了主帖以显示这些错误。 –

+0

@FelixMaxime - 我已经更新了我的答案。 – fubar

+0

试过了。另一个错误。再次编辑主要帖子。 –