我是一名业余程序员,需要一个真正的帮助来解决这个美丽的问题,因为我必须承认我真的被这个问题困住了!
在我的数据库中,我有一个« tslines »表,其中包含给定周( startdate )的值( sum_week )和给定合同( contract_id )
重要的字段是: sum_week,user_id,startdate和contract_id
我还有一个«用户»表,重要的值是« first_name,last_name »
我有很多工人在不同时间签订合同( startdate,代表一周的第一天)
示例(下表):我可以为工人A提供3行,为工人B提供2行
在某个星期(startdate),可能会发生没人在合同上工作
我想显示一个包含这些信息的表,对于contract_id = 3(ex)(此字段位于tslines表中):
sum_week 是一个字段,我不想用SQL查询重新计算
我不想每个星期运行一个查询来检查每个用户是否合作,因为如果我有ex:30周,有30个用户参与该项目,那将会成为一个问题.. < / p>
我开始构建一个包含所有可能«startdate»
的数组//Selects min and max startdate of the tslines, use $dates->maxdate and ->mindate
$dates = $contract->tslines()->whereIsOfficial(true)->select(DB::raw('MAX(startdate) as maxdate, MIN(startdate) as mindate'))->first();
//Define first date declared in tslines
$loopdate = Carbon::parse($dates->mindate);
$maxdt = Carbon::parse($dates->maxdate);
//While loop to create array of date ranges from min to max
$date_count = 0;
$daterange = array();
while($loopdate->gt($maxdt) == false)
{
$daterange[] = $loopdate->format('Y-m-d');
$loopdate->addDays(7);
$date_count++;
}
我知道我必须做一些数组操作,但我真的不知道从哪里开始,即使是查询..
我可以通过以下方式获得所有相关的合同tslines:
$合约─&GT; tslines() - &GT;得到()
但是我不知道如何构建一个包含用户信息和所有startdate的数组(即使他那周没有工作)
任何人都可以给我一些提示..非常感谢!!
提前致谢!
圣拉斐尔
答案 0 :(得分:1)
让我们从我们所知道的开始。
我们知道哪些用户已经处理了哪些合同以及日期。
使用上面的功能,我们有用户开始处理合同的最长日期和最短日期。
<强>解决方案:强>
$tslines = $contract->tslines()->orderBy('user_id','ASC')->orderBy('startdate','ASC')->get();
//I didn't see any relationship calls to the user's object, so you'll have to add one of your own. I am assuming, your `tslines` has a relationship `user` here.
$userListResult = $contract->tslines()->with('user')->orderBy('user_id','ASC')->select(\Db::raw('distinct("user_id")')->get();
$dates = $contract->tslines()->whereIsOfficial(true)->select(DB::raw('MAX(startdate) as maxdate, MIN(startdate) as mindate'))->first();
$minDate = Carbon::parse($dates->mindate);
$maxDate = Carbon::parse($dates->maxdate);
//we flatten the array for future use.
$userList = array();
foreach($userListResult as $l)
{
$userList[$l->user_id] = $l->user->first_name.' '.$l->user->last_name;
}
//Assuming you are printing a table in blade
<table>
<?php
//Print the table headers
echo"<tr>
<td>User</td>";
$currDate = clone($minDate);
do
{
echo "<td>".$currDate->format('Y-m-d')."</td>";
$currDate->addDay();
}
while($currDate->diffInDays($maxDate) !== 0);
echo "</tr>";
//Print each user's row
foreach($userlist as $userid => $username)
{
echo "<tr>
<td>
$username
</td>";
$currDate = clone($minDate);
//loop through all the dates in range (min to max date)
do
{
$foundDate = false;
//We check if user has worked on that day
foreach($tslines as $row)
{
if($row->user_id === $userid && $row->startdate->format('Y-m-d') === $currDate->format('Y-m-d'))
{
//Print result if startdate & userid matches
echo "<td>{$row->sum_week}</td>";
$foundDate = true;
//Get out of the loops
break;
}
}
if(!$foundDate)
{
echo "<td>X (didn't work)</td>";
}
$currDate->addDay();
}
while($currDate->diffInDays($maxDate) !== 0);
echo "</tr>";
}
?>
</table>