多阵列操作和合并

时间:2015-04-12 23:29:34

标签: laravel laravel-4 laravel-5

我是一名业余程序员,需要一个真正的帮助来解决这个美丽的问题,因为我必须承认我真的被这个问题困住了!

在我的数据库中,我有一个« 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表中):

enter image description here

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的数组(即使他那周没有工作)

任何人都可以给我一些提示..非常感谢!!

提前致谢!

圣拉斐尔

1 个答案:

答案 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>