Laravel 数据库的使用:需要放在哪里?在模型中还是在控制器中?

Laravel use of the database: where does it need to be placed? In Models or in Controllers?

在 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');
        }
    }

或以上none?

从学术上讲,最好只将所有基于数据的逻辑保留在模型中。但在实践中,将简单查询保留在控制器中并使用 scopes 来重复查询会更方便。在这种情况下,您的代码可读性更高且更易于维护。此外,所有 Laravel 本书都建议相同。

无论如何,它更基于意见。

你这里的用法其实用作用域更好解决

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;

您应该将查询放置在何处这个话题很常见。最终取决于您的个人喜好和具体情况。

如果您需要在别处重复使用查询,我建议您将查询放在您的模型中。但是,我必须警告您,您在使用此选项时可能会遇到问题,因为更改查询可能会产生意外结果,如果 在您的应用程序中的多个位置使用该查询。

如果您不需要重复使用查询,请将其放在控制器中。这样您就不必担心查询会更改和破坏您的控制器方法。

要回答你的问题,没有明确的地方你应该提出疑问。我只能建议不要使您的解决方案过于复杂,也不要试图将所有查询硬塞进一个模式。

虽然您提供的两个示例还有其他选项。有关这些的更多信息,请查看这些视频: