Laravel 在 2 个表上加入条件

Laravel join with conditions on 2 tables

在我的应用程序中,用户可以创建任务并将其分配给可以激活或存档的项目,或者可以在没有相关项目的情况下创建任务。

我现在要做的是获取公司用户创建的所有任务,这些任务要么分配给活动项目,要么没有分配项目。

我设法在 Company 模型中使用以下代码完成了第一部分:

public function tasks()
{
    return $this->hasMany('App\Project', 'company')
        ->join('tasks', function($join)
        {
            $join->on('projects.id', '=', 'tasks.project')
                ->where('projects.status', '=', Project::STATUS_ACTIVE);
        });
}

此函数获取分配给活动项目的所有公司任务,但我还想获取未分配给任何项目的任务(这由 [=15= 中的 project 列指示] table 设置为 0).

问题是我不知道把 orWhere 条件放在哪里。我尝试了很多更改,但其中 none 行得通。

此外,还有一件事我不明白:为什么 join 函数不是下面这样的东西?

$this->hasMany('App\Task', 'company')
    ->join('projects', ...

我不确定我是否真的理解你的问题。如果您能 post 您的模型以及关系的定义方式,那将大有帮助。 无论如何,为了浏览查询,我使用以下 "rule":

然后从 table1 中检索与 table5 中的任何寄存器相关的寄存器,并按 table5 的特定 id 值过滤。

public function navigation($table5ID){  
    return Table1::whereHas('table2',function($query) use ($table5ID){
        $query->whereHas('table3',function($query2) use ($table5ID){
              $query2->whereHas('table4',function($query3) use ($table5ID){
                $query3->whereHas('table5',function($query4) use ($table5ID){
                    $query4->where('table5_id',$table5ID);
                });
            });
        });
    })->get();
}

我做了a post on my personal blog some time ago。希望这有帮助。

经过一段时间的努力,我终于找到了解决问题的方法。

我的主要问题是由于对 Eloquent ORM and/or 数据库生成器的误解。

我为解决问题所做的工作如下:

$companyTasksQuery = DB::table('tasks')
    ->where('company', '=', $this->id)
    ->where('project', '=', 0)
    ->where('status', '=', Task::STATUS_INCOMPLETE);

return $this->hasMany('App\Task', 'company')
    ->join('projects', function($join)
    {
        $join->on('projects.id', '=', 'tasks.project')
            ->where('projects.status', '=', Project::STATUS_ACTIVE);
    })
    ->select('tasks.*')
    ->union($companyTasksQuery);

正如您从上面的代码中看到的那样,我切换了连接。以前我加入 projects table 和 tasks 但现在我正在做相反的事情 ->select() 解决了我的问题(正如你可以从我的之前的代码我完全错过了 select.

为了添加其他条件,我只是将其添加为与另一个查询的并集,该查询选择所有未分配给任何项目的未完成任务。