[英]Many to many and eager loading laravel
我有一个任务管理器,可以为每个用户分配任务。 我有这四个数据库(我仅显示此讨论所需的列)
用户:
--------------------------
| id | username |
---------------------------
| 1 | peterg |
----------------------------
| 2 | louisg |
----------------------------
任务:
-----------------------------------------------------
| id | title | project_id |
------------------------------------------------------
| 1 | Finsih hw | 1 |
---------------------------------------------------
| 2 | cut grass | 4 |
----------------------------------------------------
用户和任务user_task的数据透视表:
----------------------------------------------
| id | task_id | user_id |
---------------------------------------------
| 1 | 1 | 1 |
--------------------------------------------
| 2 | 1 | 2 |
---------------------------------------------
| 1 | 2 | 2 |
--------------------------------------------
| 1 | 2 | 4 |
--------------------------------------------
最后是我的项目表:
---------------------------
| id | title |
-----------------------------
| 1 | first_title |
---------------------------
| 2 | second_title |
------------------------------
这是任务的用户关系
public function assignedTasks()
{
return $this->belongsToMany('RL\Tasks\Task', 'user_task')
->orderBy('priority', 'ASC')
->orderBY('created_at', 'DESC')
->where('stage', '=', 1);
}
我显示此页面的Laravel路线是/{username}/assigned-task
因此当该路线被点击时,会有一个服务类来获取该用户的所有任务
public function assignedTasks($username)
{
$user = $this->member->getUserIdByUsername($username);
if(!$user) throw new UsernameNotFoundException;
$tasks = $user->assignedTasks;
return $tasks;
}
我的html来布置分配的任务:
<div id="assignments">
@foreach(array_chunk($tasks->all(), 3) as $row)
<div class="row">
<?php $task_id = [];?>
@foreach($row as $task)
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{{$task->title}}.</h3>
</div>
<div class="panel-body">
<p>{{$task->description}}</p>
<p><strong>Project: </strong>{{$task->project->title}}</p>
<p class=""><strong>Priority: </strong>{{$task->priority}}</p>
<p class="right"><strong>Stage: </strong>{{$task->stage}}</p>
<a href="">Details</a>
</div>
</div>
</div>
@endforeach
</div>
@endforeach
</div>
这可以正常工作,但是当我检查SQL时,我注意到每次尝试运行{{$task->project->title}}
从项目中运行select *,因此如果我分配了50个任务,那是sql运行的50倍。 我如何渴望以多对多关系加载项目?
您必须在getUserIdByUsername($username);
使用getUserIdByUsername($username);
加载getUserIdByUsername($username);
方法。
例如,它将看起来像
User::with('tasks')->where('username',$username)->get();
现在,当您调用$tasks = $user->assignedTasks;
它只会提取一次数据。
阅读文档急切加载
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.