【发布时间】:2020-06-14 22:29:16
【问题描述】:
我正在使用 laravel 5.8,我有四个表:
客户:id|name|code
任务:id|名称
client_task: id|client_id|task_id
月:id|client_id|task_id|exec_date
clients 和 tasks 是多对多关系,client_task 是数据透视表
这个想法是我想像这样在html中创建一个表格
-------------------------------------------
|#|client name|task 1|task 2|task 3|task 4|
-------------------------------------------
|1| client 1 | ☐ | ☐ | /// | /// |
-------------------------------------------
|2| client 2 | /// | ☐ | ☐ | ☑ |
-------------------------------------------
|3| client 3 | ☐ | ☑ | ☑ | /// |
-------------------------------------------
每个月我都会收到所有客户和所有任务,如果客户有任务,我会显示一个复选框,否则我会显示一个空的 td,如果我为特定客户完成一项任务,我会检查此任务并插入client_id、task_id 和当前日期 exec_date 到 monthlies 表中。
我正确的查询:
$clients = DB::table('monthlies as m')
->rightJoin('client_task as clta', function ($join){
$join->on('clta.client_id', '=', 'm.client_id')
->on('clta.task_id', '=', 'm.task_id')
->rightJoin('clients as cl', function ($join){
$join->on('clta.client_id', '=', 'cl.id')->where('cl.category',1);
})
->Join('category_task as cata', function ($join){
$join->on('clta.task_id', '=', 'cata.task_id')
->Join('categories as ca2', 'cata.category_id', '=', 'ca2.id')->where('ca2.type', 1)
->rightJoin('tasks as ta', 'cata.task_id', '=', 'ta.id')->where('ta.period', 1);
});
})
->select('m.*', 'cl.id as client_id', 'cl.name as client_name', 'cl.code as client_code', 'cl.legal_form as client_legal_form', 'ta.id as task_id', 'ta.name as task_name', 'ta.type as task_type', 'ta.period as task_period')
->get();
使用此代码,我只能在 client_task 表中获得客户端/任务
问题是我想显示所有客户端或任务,即使客户端没有附加任务,反之亦然(client_task 数据透视表中不存在)。
【问题讨论】:
-
我很好奇,您为什么要使用查询生成器编写“原始”SQL 查询?如果您的关系设置正确,您可以简单地执行
Client::with('tasks')->get(),然后遍历生成的Eloquent\Collection。 Laravel 将为您完成所有这些繁重的工作;) -
我有很多客户端和很多任务,我想获取所有客户端 + 所有任务 + 检查二进制(客户端任务)是否存在,如果不存在,我将在“数据表”中显示一个空的“td” ',如果存在,我检查此二进制文件是否存在于
monthlies表中,如果存在,则它将显示为“已检查 + 禁用”复选框,如果不存在,则表示我没有为该客户端完成此任务,我将显示一个简单的复选框,所以我想在一个查询中得到所有这些 -
我仍然强烈建议使用
Eloquent来执行此操作,我会尝试发布涵盖此问题的答案,但可能需要我一分钟! -
好的,非常感谢