【发布时间】:2020-05-25 19:06:29
【问题描述】:
在我的 Laravel 应用程序中,我有 3 个模型类:Project、Task 和 TaskState。这基本上是代码:
Project.php
class Project extends Model
{
// ...
public function tasks()
{
return $this->hasMany('App\Task');
}
}
Task.php
class Task extends Model
{
// ...
public function project()
{
return $this->belongsTo('App\Project');
}
public function state()
{
return $this->hasOne('App\TaskState');
}
}
TaskState.php
class TaskState extends Model
{
// ...
public function task()
{
return $this->belongsTo('App\Task');
}
}
我想从项目中过滤所有处于“打开”状态的任务。现在我正在使用 join 子句,但 我想知道是否可以使用类似的方法:
Task::where('state.name', 'open')->get();
我不明白为什么这不起作用,因为可以从类的“内部”使用 where 子句上的点。例如,来自getFooAtribute() 方法:
class Project extends Model
{
// ...
public function getOpenTasksSumAttribute()
{
// This works. Why not from outside?
return $this->tasks->where('state.name', 'open')->count();
}
}
编辑:
whereHas() 方法解决了我的问题。
同样上面的getOpenTasksSumAttribute()方法其实也不管用,但是当我把Task模型改成return this->belongsTo('App\TaskState');的时候就成功了。
【问题讨论】:
-
Task::where('state.name', 'open')->get();的SQL结果是什么?