我对laravel中的数据库查询感到困惑,我们在哪里编写查询:在控制器,模型或路由中?
我经历了很多教程,看到了很多不同.只是制造混乱.
请解释一下
它取决于不同的因素,但简而言之,您可以在模型,控制器或存储库中编写它们
如果你正在编写一个控制器动作,并且你需要一个只能使用一次的查询,那么直接在控制器中编写查询(甚至在路径的闭包中)就完全没问题了.
例如,如果要获取所有类型的用户admin
:
$admins = User::where('type', 'admin')->get();
现在,假设您需要在多个控制器方法中获取管理员; 您可以创建一个Repository类来包装对用户模型的访问,并在Repository中编写查询,而不是重写相同的查询:
class UserRepository
{
public function getAllAdmins()
{
return User::where('type', 'admin')->get();
}
}
现在在您的控制器中,您可以注入存储库并使用相同的存储库方法来获取管理员用户:这将使您保持代码DRY,因为您不必在控制器的操作中重复相同的查询
调节器
public function __construct(UserRepository $userRepo)
{
$this->userRepo = $userRepo;
}
//controller action
public function index()
{
$admins = $this->userRepo->getAllAdmins();
}
最后,我们假设您需要一个查询来计算管理员用户的数量.您可以在以下位置编写此查询UserRepository
:
public function getAdminNum()
{
return User::where('type', 'admin')->count();
}
它可以,但我们可以注意到User::where('type', 'admin')
查询的片段与查询共享.getAllAdmins
所以我们可以通过使用查询范围来改进它:
用户模型
public function scopeAdmins($query)
{
return $query->where('type', 'admin');
}
通过这种UserRepository
方法,我们可以在以下方法中重写以前的查询:
public function getAllAdmins()
{
return User::admins()->get();
}
public function getAdminNum()
{
return User::admins()->count();
}
我刚刚向您展示了一个在模型中写入查询的情况