Laravel 如何通过关系静态地使用where子句?

Laravel 如何通过关系静态地使用where子句?,laravel,eloquent,Laravel,Eloquent,在我的Laravel应用程序中,我有3个模型类:Project、Task和TaskState。这基本上就是代码: Project.php class Project extends Model { // ... public function tasks() { return $this->hasMany('App\Task'); } } class Task extends Model { // ... public

在我的Laravel应用程序中,我有3个模型类:
Project
Task
TaskState
。这基本上就是代码:

Project.php

class Project extends Model
{
    // ...

    public function tasks()
    {
        return $this->hasMany('App\Task');
    }
}
class Task extends Model
{
    // ...

    public function project()
    {
        return $this->belongsTo('App\Project');
    }

    public function state()
    {
        return $this->hasOne('App\TaskState');
    }
}
class TaskState extends Model
{
    // ...

    public function task()
    {
        return $this->belongsTo('App\Task');
    }
}
Task.php

class Project extends Model
{
    // ...

    public function tasks()
    {
        return $this->hasMany('App\Task');
    }
}
class Task extends Model
{
    // ...

    public function project()
    {
        return $this->belongsTo('App\Project');
    }

    public function state()
    {
        return $this->hasOne('App\TaskState');
    }
}
class TaskState extends Model
{
    // ...

    public function task()
    {
        return $this->belongsTo('App\Task');
    }
}
TaskState.php

class Project extends Model
{
    // ...

    public function tasks()
    {
        return $this->hasMany('App\Task');
    }
}
class Task extends Model
{
    // ...

    public function project()
    {
        return $this->belongsTo('App\Project');
    }

    public function state()
    {
        return $this->hasOne('App\TaskState');
    }
}
class TaskState extends Model
{
    // ...

    public function task()
    {
        return $this->belongsTo('App\Task');
    }
}
我想筛选项目中处于“打开”状态的所有任务。现在我使用的是join子句,但是我想知道是否可以使用这样的语句:

Task::where('state.name', 'open')->get();
我不明白为什么这不起作用,因为在where子句上使用点可以从类的“内部”开始。例如,从
getFooartibute()
方法:

class Project extends Model
{
    // ...

    public function getOpenTasksSumAttribute()
    {
        // This works. Why not from outside?
        return $this->tasks->where('state.name', 'open')->count();
    }
}
编辑
whereHas()
方法解决了我的问题


另外,上面的
getOpenTasksSumatAttribute()
方法实际上不起作用,但当我将
Task
模型更改为
returnthis->belongsTo('App\TaskState')时,它起作用了

我认为它们中的任何一个都不应该起作用。通常方法是使用
whereHas()
对关系进行条件化处理

Task::whereHas('state', function ($query) {
    $query->where('name', 'open');
})->get();

Task::where('state.name','open')->get()的SQL结果是什么?我认为那里也有问题,但是
where has
方法正是我所需要的。非常感谢。语法中有一个错误,但请更新您的问题,我将对此进行调查:)