我对 Laravel 中的数据库查询有点困惑,我们必须在哪里编写查询:在 Controller 、模型或路由中?
我已经阅读了很多教程,并且看到了很大的差异。只是制造困惑。
请解释一下
最佳答案
这取决于不同的因素,但总之你可以将它们写在模型、 Controller 或存储库中
如果您正在编写 Controller 操作,并且需要一个仅使用一次的查询,那么直接在 Controller 中编写查询(甚至在路由的闭包中)是完全可以的.
例如,如果您想获取 admin
类型的所有用户:
$admins = User::where('type', 'admin')->get();
现在,假设您需要在多个 Controller 方法中获取管理员;您可以创建一个存储库类来包装对用户模型的访问,然后在存储库中编写查询,而不是重写相同的查询:
class UserRepository
{
public function getAllAdmins()
{
return User::where('type', 'admin')->get();
}
}
现在,在您的 Controller 中,您可以注入(inject)存储库并使用存储库的相同方法来获取管理员用户:这将使您的代码保持干燥,因为您不必在 Controller 的操作中重复相同的查询
Controller
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< 中的查询共享
所以我们可以通过使用 query scopes 来改进这一点:
用户模型
public function scopeAdmins($query)
{
return $query->where('type', 'admin');
}
这样,在 UserRepository
方法中,我们可以将之前的查询重写为:
public function getAllAdmins()
{
return User::admins()->get();
}
public function getAdminNum()
{
return User::admins()->count();
}
我刚刚向您展示了一个将查询写入模型内的情况
关于php - 我们必须在 Laravel : in model, Controller 或路由中编写查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34449446/