Laravel加入2桌的条件

时间:2015-03-24 15:54:41

标签: laravel eloquent

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

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

我设法在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);
        });
}

此函数获取分配给活动项目的所有公司任务,但我还想获取未分配给任何项目的任务(这由project表中的tasks列指示设为0)。

问题是我不知道在哪里放orWhere条件。我尝试了很多改动,但没有一个改变。

此外,有一件事我没有得到:为什么连接功能不像以下那样?

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

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解你的问题。如果您可以发布模型以及如何定义关系,那将会有很大帮助。 无论如何,为了浏览查询,我使用以下"规则":

Schema

然后从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。希望这会有所帮助。

答案 1 :(得分:0)

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

我的主要问题是由于对Eloquent ORM和/或数据库构建器的误解。

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

$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加入了tasks表格,但现在我反过来做->select()解决了我的问题(正如您之前的代码所示)我完全错过了select

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