dongying3830 2014-08-24 17:23
浏览 36

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

I'm having issues getting a proper count total with my Laravel model.

Model Structure

  • User
  • Item
  • ItemLike

A user can have multiple Items, and each of these Items can have multiple ItemLikes (when a user 'likes' the item).

I can easily get the individual ItemLike counts when using an Item model:

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

But I can't figure out how to get the total # of ItemLike's a User has across all the Item's he owns.

EXAMPLE

User A has 3 Items. Each Item has 5 ItemLike's, for a grand total of 15.

I tried using eager loading on the User model like this:

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

But that returns 3 (the # of Items)

These are the queries it ran, which appears like the second query is the one I want, yet every way I try it I still get 3 instead of 15

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

3条回答 默认 最新

  • dpg76975 2014-08-24 17:38
    关注

    Isn't it just a case of creating a method that would return the number of items for the model. e.g.:

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

    And then User::nbLikes() should return the piece of data you are looking for?

    评论
  • douba7784 2014-08-24 17:51
    关注

    try this: $query="select count(il.id) from item_likes il,item itm where il.item_id=itm.id and tm.user_id=1000";

    评论
  • douxian0279 2014-08-24 18:53
    关注

    After suggestions from others I found 2 solutions to get the result.

    Using whereIn:

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

    2 queries for a total of 410μs

    Using join:

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

    2 queries for a total of 600μs

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部