Есть ли лучший способ, чем использовать соединения в этом случае? - PullRequest
0 голосов
/ 27 января 2019

Я узнал об отношениях Laravel Eloquent.У меня работает код, см. Ниже, но мне интересно, есть ли лучший способ, например, с помощью Eloquent.

Это код, который работает:

   $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);
        }
    }

}

Связи таблиц выглядят так: Связи таблиц

Вывод выглядит примерно так:

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.

Мои отношения 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...