【问题标题】:Laravel use of the database: where does it need to be placed? In Models or in Controllers?Laravel 使用数据库:需要放在哪里?在模型中还是在控制器中?
【发布时间】:2016-08-24 14:30:39
【问题描述】:

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

或者以上都不是?

【问题讨论】:

    标签: database laravel models


    【解决方案1】:

    在学术上,最好将所有基于数据的逻辑仅保留在模型中。但在实践中,将简单的查询保留在控制器中并使用scopes 处理重复的内容会更方便。在这种情况下,您将获得更易读且更易于维护的代码。此外,所有 Laravel 书籍都提出了相同的建议。

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

    【讨论】:

    • 所以选择是我的?
    • 我想你可以通过一个例子给出更好的答案,而不是为我,但对于一些初学者来说,我等着有人给人们一个更好的例子来解释这个问题。
    • 选择永远是你的,但不要远离实践,被社区接受。 始终编写代码,就好像最终维护您的代码的人将是一个知道您住在哪里的暴力精神病患者 John Woods
    【解决方案2】:

    你在这里的使用实际上用范围更好地解决了。

    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;
    

    【讨论】:

      【解决方案3】:

      您应该将查询放在哪里是一个常见的主题。这最终取决于您的个人喜好和您的具体情况。

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

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

      要回答您的问题,您应该在哪里进行查询并没有明确的位置。我只能建议不要使您的解决方案过于复杂,也不要试图将所有查询硬塞到一个模式中。

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

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-20
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        相关资源
        最近更新 更多