我正在将页面转换为Laravel。我曾经有一个PHP脚本(GET)来处理任何表中的选择查询。我所要做的就是发送 table 参数,它会返回结果。
这个想法是有一个这样的控制器:
<?php
namespace App'Http'Controllers;
use Illuminate'Http'Request;
use App'Http'Requests;
use DB;
class Projects extends Controller
{
/**
* Get projects based on the table
*
* @return Response
*/
public function index($table)
{
$result = DB::select("SELECT projectid FROM `" . $table . "` WHERE isClass=1 LIMIT 10");
return view('pages.allviews', ['results' => $result]);
}
}
问题是页面将执行此查询三次。碰巧,控制器将在执行后立即创建视图,唯一的解决方案是在控制器中重复查询三次。
我想避免这样做,我想将控制器与页面需要的内容分开,并能够在页面需要的时间执行它。概括是关键。
有没有办法做到这一点,并在不必创建新的控制器的情况下保持这种抽象?
有很多
方法可以做到这一点,但最重要的是,您应该将查询逻辑从控制器提取到单独的类中,以便可以重用该对象。基本上,存储库类对此有好处,但也可以创建查询对象。无论如何,让我们保持简单。因此,正如我所提到的,您有很多选择,根据您的项目,您可以决定策略。
在您的情况下,您可以简单地使用 DB::table()
方法并将其缓存一段时间,以便对于接下来的后续调用,将返回缓存的结果。立即查看考试:
$limit = 10;
$table = 'users';
$select = ['id', 'name'];
$result = 'Cache::remember($table, 60, function() use ($table, $select, $limit) {
return 'DB::table($table)->limit($limit)->get($select);
});
然后,要访问缓存的查询,您可以使用以下内容:
if('Cache::has('users')) {
$users = 'Cache::get('users');
}
因此,虽然这可能会解决您的问题,但我建议您创建一个单独的类并将该查询逻辑(带缓存)保留在该类中,例如:
namespace Some'Namespace;
use DB, Cache;
class CachedQuery {
public function getResult($table, $select = '*', $limit = 10, $timeout = 60)
{
return Cache::remember($table, $timeout, function() use ($table, $select, $limit) {
return DB::table($table)->limit($limit)->get($select);
});
}
}
然后像这样使用它:
use Some'Namespace'CachedQuery;
class SomeController extends Controller {
public function index(CachedQuery $cachedQuery, $table)
{
// The $table parameter is required, rest are optional
$result = $cachedQuery->getResult($table, ['projectid']);
}
}
此外,还可以使用 IoC/服务容器对象临时存储数据。此外,可以创建一个接口并将接口绑定到类以从服务容器获取它,但我尽可能保持简单。希望你明白了。另外,请检查缓存组件。