我在 Laravel 应用程序中使用存储库模式。 我的问题与处理存储库和策略模式时的重复 SQL 查询有关。这是一些例子。
// My Controller
public function destroy($id)
{
$this->authorize('delete', $this->repository->find($id));
$this->repository->delete($id);
return back()->with('success', 'Item has been removed');
}
执行上述函数将运行 2 个完全相同的“选择”查询。 第一个是在获取
authorize
函数的模型时,第二个是在执行删除函数时。
这是这个函数的定义
//repository function
public function delete($id)
{
return $this->find($id)->delete();
}
请注意,我知道为什么执行 2 个相同的查询。我的问题是在使用策略和存储库模式时如何避免这种情况发生?
我是否应该将模型传递给存储库中的删除函数,因此存储库删除函数将是
//new delete function i my repository class
public function delete($model)
{
return $model->delete();
}
谢谢你
在控制器中:
public function destroy(Link $link)
{
$this->authorize('delete', $link);
$this->repository->delete($link);
return back()->with('success', 'Item has been removed');
}
是的,在仓库的删除函数中可以直接写 $model->delete(); 这会将 2 个选择查询减少到 1 个。
在您的存储库中:
// repository function
public function delete($model)
{
return $model->delete();
}
在你的控制器内部:
// My Controller
public function destroy($link)
{
$model = $this->repository->find($link); // Retrieve model once.
$this->authorize('delete', $model); // Authz model.
$this->repository->delete($model); // Pass model to delete.
return back()->with('success', 'Item has been removed');
}
首先使用
$this->repository->find($id)
检索模型一次。然后在 authz 检查和删除方法中重用此模型实例,这可以防止 Laravel 需要在删除方法中重新查询相同的模型。