计算Laravel中的远距离关系(渴望加载?)

时间:2014-08-25 01:23:45

标签: php mysql laravel eager-loading

我在使用Laravel模型时遇到了正确的计数问题。

模型结构

  • 用户
  • 项目
  • ItemLike

用户可以拥有多个商品,并且每个商品都可以有多个商品喜欢(当用户喜欢该商品时)。

使用Item模型时,我可以轻松获得单独的ItemLike计数:

return $this->itemLikes()->count();

但是,我无法弄清楚如何获得用户拥有的所有项目所拥有的项目总数#。

示例

用户A有3个项目。每个项目有5个项目,总共15个。

我尝试在User模型上使用eager loading,如下所示:

return $this->items()->with('itemlikes')->get()->count();

但是返回 3 (项目数量)

这些是它运行的查询,看起来第二个查询是我想要的,但是我尝试的每一种方式我仍然得到 3 而不是 15 < / p>

select * from `items` where `items`.`user_id` = '1000'
select * from `item_likes` where `item_likes`.`item_id` in ('1000', '1001', '1002')

3 个答案:

答案 0 :(得分:1)

在得到其他人的建议后,我找到了2个解决方案来获得结果。

使用whereIn:

$itemViewCount = ItemView::
whereIn('item_views.item_id', $this->items()->lists('id'))
->count();

return $itemViewCount;

2次查询总共410μs

使用加入:

$itemViewCount = $this->items()
->join('item_views', 'item_views.item_id', '=', 'items.id')
->count();

return $itemViewCount;

2次查询总共600μs

答案 1 :(得分:0)

仅仅是创建一个可以返回模型项目数的方法的情况。 e.g:

#UserModel
public function nbLikes()
{
    $nbLikes = 0;
    foreach($this->items() as $item) {
        $nbLikes += $item->itemLikes()->count();
    }

    return $nbLikes;
}

然后User :: nbLikes()应该返回您要查找的数据?

答案 2 :(得分:-1)

试试这个: $ query =“select count(il.id)from item_likes il,item itm where il.item_id = itm.id and tm.user_id = 1000”;