Webapp有一个很慢的功能。
我要求建议使用代码来加速此功能,从5-6秒到1-2秒。
我有表格的数据库:
table:Workers(id,fi rst_name,last_name)
table:商店(id,name)
table:worker_store(id,worker_id,store_id)
这个想法是通过worker_store表将worker连接到一个或多个商店。
在Laravel应用程序中,我有一个功能,只需一个商店,并显示工人已连接到此特定商店。这必须显示为“选择”字段,连接的工作人员标记为“已选中”,所有其他工作人员未选中。我的Laravel刀片代码看起来像这样
<select multiple name="workers[]" id="workers" class="form-control">
@foreach (App\Worker::orderBy('last_name')->get() as $worker)
<option value="{{$worker->id}}"
**@if ($object->hasWorker($worker->id))
selected @endif**>{{$worker->getName()}}
</option>
@endforeach
</select>
数据库是MySQL,工作表有30,000条记录。这是非常缓慢的,而laravel向数据库发出30 000个单独的查询,以检查每个工人是否链接到特定商店(上面代码的粗体部分)。
请建议一个解决方案,不需要查询30 000次数据库,并在不超过1-2秒内生成完整(当前代码大约需要5-6秒)。
答案 0 :(得分:0)
这可以放在视图中,但这里是我认为你正在寻找的基本概念......
// Grab all the workers so that we can loop through them.
$workers = App\Worker::all();
// Grab a list of the worker id's for the store we are currently searching for.
$storeWorkers = App\Store::with('workers')->find(1)->workers->lists('id');
// Use in_array to determine if the worker is currently working in the store we are looking at.
@foreach ($workers as $worker)
<option value="{{ $worker->id }}" {{ in_array($worker->id, $storeWorkers) ? 'selected' : '' }}>{{ $worker->name }}</option>
@endforeach
这应该可以为您提供总共3个查询。 1抓住所有工人,2抓住工人。
看起来您的模型设置不正确。在Store
模型中,添加函数...
public function workers()
{
return $this->belongsToMany(Worker::class, 'worker_store');
}
答案 1 :(得分:0)
我认为您应该考虑如何制作此应用程序。
在一个选择中有30k选项没有任何意义,谁将通过选择签入和退出选项的30k选项?谁会读这些选项?
没有意义,是一个无法使用的应用程序。你为什么要制作一个没有人可以使用的应用程序?
首先,你需要考虑问题,然后是如何解决问题,你的解决方案如何实际帮助某人解决问题,而不是引起更复杂的问题。抛出所有数据不是任何解决方案。
您可能应该想到一个AJAX / React / Vue.js或类似的前端事物,它允许用户以有意义的方式与数据进行交互。
但是,这需要时间,因此,您可以至少通过创建一个页面来快速解决它,您可以根据名称或其他内容过滤工作人员,然后使用分页,每个选项旁边都有一个复选框,表示if是否被选中并且允许选择附加内容,或者代替复选框,指示当前状态的颜色或图标以及添加/删除它的按钮。
通过这种方式,用户可以搜索所需的选项,导航,以更合适和可行的方式更改内容。
注意:另外,请确保数据库中的每个列都包含与其他数据相关的索引,您订购的每一列,以及用于过滤的每一列。
您的问题不是查询,因为您在HTML中投入了大量数据