我已经能够使用以下原始sql获得所需的查询结果:

select `person`.`id`, `full_name`, count(actions.user_id) as total
from `persons`
left join `actions`
on `actions`.`person_id` = `persons`.`id` 
and `actions`.`user_id` = $user
where `type` = 'mp' 
group by `persons`.`id`

但我还没能让它有说服力地发挥作用.

基于一些类似的答案,我try 了->where()leftJoin()以内的函数,但每个人的count个动作还没有被$user过滤.目前的情况是:

$query = Person::leftJoin('actions', function($q) use ($user)
        {
            $q->on('actions.person_id', 'persons.id')
                ->where('actions.user_id', $user);
        })
        ->groupBy('persons.id')
        ->where('type', 'foo')
        //->where('actions.user_id', '=', $user)
        ->get(['persons.id', 'full_name', DB::raw('count(actions.id) as total')]);

我至少朝着正确的方向前进了roughly英里,对吧...?

如果相关的话,Persons.php模型有两个actions关系:

public function actions()
{
    return $this->hasMany('Action');
}

public function actionsUser($id)
{
    return $this->hasMany('Action')->where('user_id', $id);
}

推荐答案

作为参考,我是这样解决的:

$query = Person::leftJoin('actions', function($q) use ($user)
        {
            $q->on('actions.person_id', '=', 'persons.id')
                ->where('actions.user_id', '=', "$user");
        })
        ->groupBy('persons.id')
        ->where('type', 'foo')
        ->get(['persons.id', 'full_name', DB::raw('count(actions.id) as total')]);

奇怪的是,leftJoin中的->where()子句需要语音标记才能正确地通过sql查询传递变量(同样,"2"似乎不起作用,而"2"起作用).

Laravel相关问答推荐

Laravel中的HTTP请求如何工作?

未将Laravel Blade属性传递给组件或类

如何在生产中的 laravel 应用程序中获取标头请求值?

Laravel:子文件夹中的 lang 文件

如何防止 Laravel 路由被直接访问(即非 ajax 请求)

PHP Laravel:如何设置或获取会话数据?

Laravel Auth::attempt() 返回 false

如何在使用 Laravel 在控制器中发送邮件之前更改邮件配置?

SQLSTATE [HY000]:一般错误:1005 无法创建表 - Laravel 4

Laravel timestamps() 不会创建 CURRENT_TIMESTAMP

未找到 PHP 5.4 和 Laravel 类Memcached

如何在 Eloquent 上设置条件关系

如何在 Laravel 中创建类别的嵌套列表?

调用未定义的方法 Maatwebsite\Excel\Excel::load()

在 Laravel 容器中覆盖单例

测试指向外部站点的重定向链接

如何使用 Laravel 测试授权重定向?

Laravel 用户能力

如何获取 Laravel 块的返回值?

如何在 Laravel 5.3 中获取当前的语言环境