【问题标题】:How to use where clause through relationships on Eloquent statically?如何通过 Eloquent 上的关系静态使用 where 子句?
【发布时间】:2020-05-25 19:06:29
【问题描述】:

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

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结果是什么?

标签: laravel eloquent


【解决方案1】:

不要认为它们中的任何一个都应该起作用。通常的做法是使用whereHas()为关系做条件。

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

【讨论】:

  • 我认为那里也有问题,但 whereHas 方法正是我所需要的。非常感谢。
  • 语法有错误,否则更新您的问题,我会调查它:)
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2013-09-09
  • 2013-09-24
  • 1970-01-01
  • 2022-12-07
  • 2022-10-08
相关资源
最近更新 更多