2016-10-12 7 views
1

У меня следующие отношения. User->hasMany(Posts) и User->belongsToMany(Following). Теперь я хочу получить следующее. Получите всех следующих пользователей пользователя, у которого есть определенный тип post. Я пришел к настоящему времениLaravel count Количество результатов от whereHas

$writers = $user 
      ->following() 
      ->with('posts') 
      ->whereHas('posts' ,function($query){ 
       $query->where('type','article'); 
      }) 
      ->get(); 

Это нормально и возвращает только пользователей, у которых есть хотя бы одно сообщение типа статьи. Что я хочу здесь также в ответ

{ 
    "id": 37, 
    "name": "Telis Xrysos", 
    "email": "[email protected]", 
    "url": "", 
    "personal_quote": "", 
    "profile_image_url": "/assets/images/user-no-image.jpg", 
    "private": "0", 
    "posts": [ 
     { 
     "id": 238, 
     "description": "This is Tony Montana #Tony #Montana", 
     "source": "Tony Montana Quote", 
     "image_url": null, 
     "type": "article", 
     "likes": 0, 
     "comments": 0, 
     "user_id": 37, 
     "created_at": "2016-10-11 16:26:28" 
     } 
    ] 
    } 

Чтобы включить счетчик, сколько его постов являются статьи. Я мог бы сделать счет после атрибута posts, хотя это только временное и впоследствии будет удалено.

Я попытался это, но все, что я получаю дополнительный атрибут для каждого пользователя articles_count = []

public function articlesCount() 
    { 
     return $this->posts()->selectRaw('id, count(*) as aggregate')->where('type','article')->groupBy('id'); 
    } 

$writers = $user 
      ->following() 
      ->with('posts') 
      ->with('articlesCount') 
      ->whereHas('posts' ,function($query){ 
       $query->where('type','article'); 
      }) 
      ->get(); 
+0

Эта [ссылка] (http://laravel.io/forum/05-03-2014-eloquent-get-count-relation) может вам помочь! – Maraboc

ответ

0

я просто поместить пользовательский атрибут в красноречивы

protected $appends = ['ArticleCount']; 
    public function getArticleCountAttribute(){ 
    return $this->posts->count(); 
    } 

не забыть отношения тоже:

public function posts(){ 
    return $this->hasMany('app\posts','id_user','id'); 
} 
+0

Еще одна вещь. Это также загружает сообщения в объект пользователя. Как я могу получить только счет? – LefterisL

+0

использовал 'makeHidden ('posts')' на данный момент, но не знаю, является ли это лучшим вариантом производительности. – LefterisL

+0

'$ this-> posts() -> count()' должен быть лучшим вариантом – Skysplit