我无法实现构建可过滤的复杂查询的目标。
我有5张桌子。其中一个是时间跟踪表。为了保持全局性,我只需存储item_id
和time_categories_id
来识别它是哪个项目。
我还需要一些不直接相关的附加信息,例如,我需要分配给任务的客户端信息。
所以我有以下表格(以简短形式列出):
times
--------------------------------------------------------
| id | name | description | item_id | time_category_id |
--------------------------------------------------------
time_categories
-------------
| id | name |
-------------
clients
------------------------------------
| id | company| name | description |
------------------------------------
(client has many projects and projects may have many clients)
projects
------------------------------------
| id | company| name | description |
------------------------------------
tasks
----------------------------------------
| id | name | description | project_id |
----------------------------------------
tickets
------------------------------------------------
| id | company| name | description | client_id |
------------------------------------------------
现在我想创建一个过滤函数,其中的返回值应取决于是否提交了客户端或项目ID。
对于此过滤器,我创建了以下查询:
$timeQuery = Time::select(array(
'times.*',
'time_categories.name as type',
'tasks.name as task_name',
'tasks.description as task_description',
'tickets.name as ticket_name',
'tickets.description as ticket_description'))
->join('time_categories','times.time_category_id','=','time_categories.id')
->leftJoin('tasks',function($join) use ($project){
if(!empty($project))
{
$join->on('times.item_id', '=', 'tasks.id')
->where('tasks.project_id','=',$project);
}else{
$join->on('times.item_id', '=', 'tasks.id');
}
})
->leftJoin('tickets',function($join) use ($client){
if(!empty($client))
{
$join->on('times.item_id','=','tickets.id')
->where('tasks.project_id','=',$client);
}else{
$join->on('times.item_id','=','tickets.id');
}
});
所以我最终到了这里。我没有收到错误,但是我收到所有数据而不是仅依赖于客户端或项目ID的过滤数据。
有人有建议吗?