我一直在学习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中有更好的方法来解决这个问题?