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

时间:2016-04-29 12:17:11

标签: database laravel models

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

或者以上都没有?

3 个答案:

答案 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)

您应该在哪里放置查询的主题是常见的。它最终取决于您的个人偏好和您的特定情况。

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

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

要回答您的问题,您没有明确的地方可以进行查询。我所能提出的建议是,不要过度复杂化您的解决方案,也不要试图将所有查询分解为一种模式。

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