php - 我们必须在 Laravel : in model, Controller 或路由中编写查询吗?

标签 php laravel laravel-5 orm eloquent

我对 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/

相关文章:

php - 如果 mysql 列 =x echo 'x' 否则如果 y echo 'y'

php - mysql 对象未转换为 int

javascript - 通过 Ajax 将页面加载到 div 返回错误

php - 如何使用 Laravel 5.5 从多态关系中检索数据?

php - 身份验证后始终重定向到根路径 [laravel]

php - 获取复选框文本值

php - 如何优化mysql中的查询

php - 拉维尔 5 : differentiate if new row inserted in DB

php - 在 Laravel 5.1 中将对象转换为数组

php - Laravel 中的多个动态 url 重定向