在这种情况下,有没有比使用联接更好的方法了?

时间:2019-01-27 12:35:30

标签: laravel eloquent

我一直在学习Laravel雄辩的关系。我的代码可以正常工作,请参阅下文,但我想知道是否有更好的方法,例如使用口才。

这是有效的代码:

   $tasks = DB::table('tasksdoing')
    ->join('tasksplanned', 'tasksplanned.planid', '=', 'tasksdoing.planid')
    ->join('tasknames', 'tasknames.taskid', '=', 'tasksplanned.taskid')
    ->join('categories', 'categories.catid', '=', 'tasknames.categoryid')
    ->join('projects', 'projects.projectid', '=', 'categories.projectid')
    ->selectRaw('projectname, catname, planneddate, tasksdoing.planid, tasksplanned.taskid, tasksplanned.estimation, taskname, sum(duration) as sumDuration')
    ->groupBy('tasksdoing.planid', 'planneddate')
    ->orderby('projects.projectname', 'asc')
    ->whereDate('planneddate', '>=', '2018-12-30')
    ->get();

    //dd(DB::getQueryLog());

    $tasksListed = array();
    foreach($tasks as $task)
    {
        if(!in_array($task->taskid, $tasksListed))
        {
            echo "<strong>" . $task->projectname . ":</strong> " . $task->taskname . " (" . $task->catname .  ") - "; 
            $taskdetails = $tasks->where('taskid', $task->taskid);
            $arrDuration = array();
            foreach($taskdetails as $taskdetail)
            {
                echo $taskdetail->sumDuration . ", ";
                array_push($arrDuration, $taskdetail->sumDuration);
            }
            $averageDuration = array_sum($arrDuration)/count($arrDuration);
            echo "(" . $averageDuration . ")";
            echo "<br>";
            array_push($tasksListed, $task->taskid);
        }
    }

}

表关系如下所示: table relationships

输出是这样的:

LMS:升级(维护)-32、16、37(28.3333333333)

LMS:簿记(财务)-10、9,(9.5)

LMS:迁移(维护)-43,(43)

研究:laravel(PHP)-27,504,0,397,286,(242.8)

学习:写作(博客)-28、60、41、38、79(49.2)

但是,我想知道这是否是最好的方法,或者我是否可以使用Eloquent用更少的行(并且没有连接)完成同一件事。

我的雄辩关系如下:

class tasksplanned extends Model
{
  public function tasksdoing()
  {
     return $this->hasMany(tasksdoing::class, 'planid', 'planid');
  }

  public function tasknames()
  {
     return $this->belongsTo(tasknames::class, 'taskid', 'taskid');
  }
}


class tasksdoing extends Model
{
}


class tasknames extends Model
{
   public function categories()
   {
       return $this->belongsTo(categories::class, 'categoryid', 'catid');
   }
}


class categories extends Model
{
   public function projects()
   {
      return $this->belongsTo(projects::class, 'projectid', 'projectid');
   }
}

class projects extends Model
{
}

我尝试了类似的方法,但是在按项目名称排序时遇到了麻烦。而且,像tasknames.categories.projects这样的急切加载也不可能。

    $tasksplanned = tasksplanned::with('tasknames', 'tasknames.categories', 'tasknames.categories.projects')
    ->whereDate('planneddate', '>=', '2018-12-30')
    ->groupBy('planid', 'planneddate')
    ->get();

我应该坚持使用联接,还是Laravel中有更好的方法来解决这个问题?

0 个答案:

没有答案