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
.
为了添加其他条件,我只是将其添加为与另一个查询的并集,该查询选择所有未分配给任何项目的未完成任务。
在我的应用程序中,用户可以创建任务并将其分配给可以激活或存档的项目,或者可以在没有相关项目的情况下创建任务。
我现在要做的是获取公司用户创建的所有任务,这些任务要么分配给活动项目,要么没有分配项目。
我设法在 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
.
为了添加其他条件,我只是将其添加为与另一个查询的并集,该查询选择所有未分配给任何项目的未完成任务。