【问题标题】:Many to Many relationship query. Laravel多对多关系查询。拉拉维尔
【发布时间】:2015-04-13 22:28:57
【问题描述】:

我试图弄清楚如何在查询中进行查询。 (如果这有道理的话)我想抓住所有的活动。对于每个活动,我想获取执行该活动的用户数。然后我想根据进行每个活动的用户数量以 DESC 顺序对所有活动进行排序。我基本上是在制作一个“热门活动页面”,我会在其中显示从大多数用户完成的活动开始的所有活动。

为此我有 3 个主表

用户

| id | name | password | email | created_at |

活动

| id | title | description | created_at |

resource 这是我用于帖子的表格,它显示了哪个用户做了哪个活动。 (用户可以显示他们做了什么活动,并在帖子中附加媒体和位置)

| 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 进行此查询?

提前致谢!

【问题讨论】:

    标签: php mysql sql laravel eloquent


    【解决方案1】:

    试试

    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; 
    }
    

    【讨论】:

    • 哇,这太完美了!你是救生员!
    • 请验证结果。我没有对此进行测试,只是一时兴起将其搅打在一起。我认为可能是一个问题是它会在分组之前计算所有user_id。确保由此产生的user_count 是特定activity_id 的计数。
    • 啊,是的,我刚试了一下。它正在获取所有 user_id,包括重复项。我需要它与 user_id 不同,并且只获取执行每个活动的用户计数,而不是每次用户执行活动时
    • 我有这个例子 - sqlfiddle.com/#!2/f3dcf/3 - 你真正需要使用的唯一列是activity_id和user_count。看起来它对我有用。如果您想要的只是活动并且计数,则无需知道 user_ids。
    • P.S.无论如何,按活动 ID 分组会使 user_id 数据无用。
    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2014-11-12
    • 2022-10-14
    相关资源
    最近更新 更多