Webapp有一个功能是慢的。
我要求建议代码将这个函数的速度从5-6秒提高到1-2秒。
我有有表格的数据库:
表:工人(id,first_name,last_name)
表:商店(id,名称)
表: worker_store (id,worker_id,store_id)
这个想法是工人通过worker_store表连接到一个或多个商店。
在Laravel应用程序中,我有一个功能,它只使用一个商店,并显示员工与这个特定的商店相连接。这必须显示为“select”field,连接的工作人员标记为“selected”,所有其他工作人员都被显示为未选中。我的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,而worker表有30,000条记录。这是非常缓慢的,而laravel对数据库进行了30000个单独的查询,以检查每个工作人员是否链接到特定的商店(上面代码的粗体部分)。
请建议一个不需要查询30000次数据库并在不超过1-2秒内生成完整的解决方案(当前代码大约需要5-6秒)。
发布于 2016-09-09 17:52:06
这将是很多的意见,但这是基本的概念,我认为你正在寻找的.
// 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个查询。一抓工人,二抓工人。
似乎你的模型设置不正确。在您的Store模型中,添加以下函数..。
public function workers()
{
return $this->belongsToMany(Worker::class, 'worker_store');
}发布于 2016-09-10 22:08:22
我认为您应该考虑一下您是如何创建这个应用程序的。
在select中有30k选项是没有意义的,谁将通过select签入和退出选项的30k选项?谁会读这些选项呢?
它没有任何意义,是一个不可能使用的应用程序。你为什么要做一个没有人能使用的应用程序?
首先你需要考虑问题,然后是如何解决问题,你的解决方案将如何帮助别人解决问题,而不是造成更复杂的问题。抛出所有数据并不是任何事情的解决方案。
您可能应该想到AJAX/React/Vue.js或类似的前端功能,它允许用户以有意义的方式与数据进行交互。
但是,这需要时间,因此,您至少可以通过创建一个页面来快速解决这个问题,在该页面中,可以根据名称或其他内容筛选工作人员,然后使用分页,每个选项旁边都有一个复选框,指示是否选中并允许选择附加项,或者代替复选框--一个指示当前状态的颜色或图标--以及一个按钮来添加/删除它。
这样,用户就可以搜索它想要的选项,导航东西,以一种更合适和可行的方式改变事物。
注意:也要确保数据库中的索引在与其他数据相关的每一列中,在您订购的每一列,以及用于筛选的每一列中。
您的问题不在于查询,而在于您要在中添加大量的数据。
https://stackoverflow.com/questions/39416417
复制相似问题