Я узнал об отношениях 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?