我们在Laravel中必须在哪里编写查询:在模型,控制器或路由中?

时间:2015-12-24 08:11:30

标签: php laravel laravel-5 orm eloquent

我对laravel中的数据库查询感到困惑,我们在哪里编写查询:在控制器,模型或路由中?

我经历了很多教程,我看到了很多不同。只是制造混乱。

请解释某人

2 个答案:

答案 0 :(得分:7)

这取决于不同的因素,但简而言之,您可以在模型,控制器或存储库中编写它们

如果您正在编写控制器操作,并且您需要一个只能使用一次的查询,那么直接在控制器中编写查询(甚至在路径的闭包中)完全没问题。

例如,如果您想要获得admin类型的所有用户:

$admins = User::where('type', 'admin')->get();

现在,假设您需要在多个控制器方法中获取管理员;而不是重写相同的查询,您可以创建一个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中的查询共享所以我们可以使用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();  
}

我刚刚向您展示了一个案例,其中查询将在模型中写入

答案 1 :(得分:0)

您不在Model中写任何查询。 Model仅用于映射您将用于表的类,用户模型将映射到用户(模型名称的复数)。

您不会在像这样的路由闭包中写入查询

Route::get('/', ['as' => 'home', function(){
    $totalProblems = Problem::count();

    $solvedProblems = Problem::where('solved', 1)->get()->count();

    $unsolvedProblems = Problem::where('solved', 0)->get()->count();

    return view('Pages.index', ['totalProblems' => $totalProblems, 'solvedProblems' => $solvedProblems, 'unsolvedProblems' => $unsolvedProblems]);
}]);

这被认为是不好的做法,仅用于测试目的。

您总是在与您的路线相关联的控制器方法中编写查询,如此

Route::get('test', 'HomeController@test');

并在HomeController

<?php namespace App\Http\Controllers;
use App\Problem;

    class HomeController extends Controller {

        public function test(){
            $user = User::all();
            return view('Pages.test')->withUser($user); //or

            return view('Pages.test')->with('user' , $user);
        }
    }