在Laravel中写出数据库查询的最佳位置是什么?
在控制器或模型中?
请告诉我哪种方法是正确的:
在像这样的控制器中使用?
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use DB; // <--------
use App\Http\Requests;
use App\Http\Controllers\Controller;
class UsersController extends Controller
{
public function getUser()
{
return DB::table('users')->where('name', 'John')->value('email');
}
}
在这样的模特中使用?
<?php
namespace App\Models;
use DB; // <--------
use Illuminate\Database\Eloquent\Model;
class UsersModel extends Model
{
protected $table = 'users';
public function getUser()
{
return DB::table('users')->where('name', 'John')->value('email');
}
}
或者以上都没有?
答案 0 :(得分:2)
在学术上,最好只将所有基于数据的逻辑保留在模型中。但是在练习中,将简单查询保留在控制器中并使用scopes进行重复操作会更方便。在这种情况下,您可以更容易阅读和维护代码。此外,所有Laravel书籍都提出了同样的建议。
无论如何,它更基于意见。
答案 1 :(得分:1)
这里的用法实际上可以通过范围更好地解决。
use Illuminate\Eloquent\Database\Builder;
use Illuminate\Eloquent\Database\Model;
class User extends Model
{
// Did you know that if your model name is the singular version of your table name, you don't need to include this?
protected $table = 'users';
public function scopeForName(Builder $query, $name)
{
return $query->where('name', $name);
}
}
现在用法就是这样:
$user = User::forName('John')->email;
答案 2 :(得分:0)
您应该在哪里放置查询的主题是常见的。它最终取决于您的个人偏好和您的特定情况。
如果您需要在其他地方重用查询,我建议您将查询放在模型中。但是,我必须警告您,使用此选项时可能会遇到问题,因为更改查询可能会产生意外结果,如果该查询在您的应用程序中的多个位置使用。
如果您不需要重复使用查询,请将其放在控制器中。这样您就不必担心查询更改和破坏控制器方法。
要回答您的问题,您没有明确的地方可以进行查询。我所能提出的建议是,不要过度复杂化您的解决方案,也不要试图将所有查询分解为一种模式。
您提供的两个示例还有其他选项。有关这些的更多信息,请查看以下视频: