多对多关系查询。 Laravel
Many to Many relationship query. Laravel
我正在尝试了解如何在查询中进行查询。 (如果这有意义的话)我想抓住所有的活动。对于每个 activity,我想获得执行 activity 的用户数。然后,我想根据执行每个 activity 的用户数量按 DESC 顺序排列所有活动。我基本上是在制作一个 "Popular Activities Page",其中我展示了从大多数用户完成的 activity 开始的所有活动。
我有 3 个主要 table 用于此
用户
| id | name | password | email | created_at |
活动
| id | title | description | created_at |
资源 这是我用于 post 的 table,它显示哪个用户做了哪个 activity。 (用户可以显示他们进行了哪些活动,并将媒体和位置附加到 post)
| id | user_id | activity_id | media_id | location_id | created_at |
这是我的每个模型 table
用户模型
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');
}
}
Activity 型号
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()
我可以使用
获取特定 activity 的用户数
User::whereHas('resource', function($q) use ($activity_id){
$q->where('activity_id', $activity_id);
})->get()->count();
但我不知道如何将所有这些放在一起,以便让所有活动按用户数排序,从用户数最高的 activity 开始。
如何使用 eloquent 进行此查询?
提前致谢!
尝试
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;
}
我正在尝试了解如何在查询中进行查询。 (如果这有意义的话)我想抓住所有的活动。对于每个 activity,我想获得执行 activity 的用户数。然后,我想根据执行每个 activity 的用户数量按 DESC 顺序排列所有活动。我基本上是在制作一个 "Popular Activities Page",其中我展示了从大多数用户完成的 activity 开始的所有活动。
我有 3 个主要 table 用于此
用户
| id | name | password | email | created_at |
活动
| id | title | description | created_at |
资源 这是我用于 post 的 table,它显示哪个用户做了哪个 activity。 (用户可以显示他们进行了哪些活动,并将媒体和位置附加到 post)
| id | user_id | activity_id | media_id | location_id | created_at |
这是我的每个模型 table
用户模型
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');
}
}
Activity 型号
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()
我可以使用
获取特定 activity 的用户数User::whereHas('resource', function($q) use ($activity_id){
$q->where('activity_id', $activity_id);
})->get()->count();
但我不知道如何将所有这些放在一起,以便让所有活动按用户数排序,从用户数最高的 activity 开始。
如何使用 eloquent 进行此查询?
提前致谢!
尝试
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;
}