多对多关系查询。 Laravel

时间:2015-02-12 23:53:30

标签: php mysql sql laravel eloquent

我试图找出如何在查询中进行查询。 (如果这甚至有意义的话)我想抓住所有的活动。对于每个活动,我想获得执行该活动的用户数。然后,我想根据执行每项活动的用户数量,按DESC顺序排序所有活动。我基本上正在制作一个"热门活动页面"在那里我展示了从大多数用户完成的活动开始的所有活动。

我有3个主要表格

用户

| id | name | password | email | created_at |

活动

| id | title | description | created_at |

资源这是我用于帖子的表格,用于显示哪个用户执行了哪项活动。 (用户可以显示他们所做的活动,并将媒体和位置附加到帖子中)

| id | user_id | activity_id | media_id | location_id | created_at |

以下是每张表的模型

用户模型

class User extends Eloquent {

    protected $table = 'users';

    /**
     * get the activities associated with the given user
     * @return mixed
     */
    public function activities()
    {
        return $this->belongsToMany('Acme\Activities\Activity', 'resource', 'activity_id');
    }

    public function posts(){
        return $this->hasMany('Acme\Resource\Resource');
    }

    public function media()
    {
        return $this->hasMany('Acme\Media\Media');
    }

    public function locations()
    {
        return $this->hasMany('Acme\Locations\Location');
    }
}

活动模型

class Activity extends Eloquent  {

    protected $table = 'activities';


    public function posts(){
        return $this->hasMany('Acme\Resource\Resource', 'resource_id');
    }

    /**
     * get the users associated with the given activity card
     * @return mixed
     */
    public function users()
    {
        return $this->belongsToMany('Acme\Users\User', 'resource', 'user_id');
    }

}

资源模型

class Resource extends Eloquent {

    protected $table = 'resource';


    public function user()
    {
        return $this->belongsTo('Acme\Users\User', 'user_id');
    }

    public function activities()
    {
        return $this->belongsTo('Acme\Activities\Activity', 'activity_id');
    }

    public function media()
    {
        return $this->hasMany('Acme\Media\Media', 'media_id');
    }

    public function locations()
    {
        return $this->belongsTo('Acme\Locations\Location', 'location_id');
    }
}

我知道我可以使用

进行所有活动
Activity::get()

我可以使用

获取特定活动的用户数
User::whereHas('resource', function($q) use ($activity_id){
    $q->where('activity_id', $activity_id);
})->get()->count();

但我不知道如何将所有这些放在一起,以便按用户数排序所有活动,从用户数最多的活动开始。

如何使用eloquent进行此查询?

提前致谢!

1 个答案:

答案 0 :(得分:2)

Resource::select(DB::raw('*, COUNT(distinct(user_id)) as user_count'))->group_by('activity_id')->order_by('user_count', 'desc')->get();

然后你可以这样做

$results = Resource::select(DB::raw('*, COUNT(distinct(user_id)) as user_count'))->group_by('activity_id')->order_by('user_count', 'desc')->get();

foreach ($results as $result) {
    $activity = Activity::where('id','=',$result->activity_id)->first();
    // do stuff to display data for this activity like
    // $activity->title or $activity->description
    $count = $result->user_count; 
}