我对laravel中的数据库查询感到困惑,我们在哪里编写查询:在控制器,模型或路由中?
我经历了很多教程,我看到了很多不同。只是制造混乱。
请解释某人
答案 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);
}
}