【问题标题】:Is it better to query a database from the controller or with a model function in laravel?从控制器查询数据库还是在 laravel 中使用模型函数更好?
【发布时间】:2017-03-02 18:30:42
【问题描述】:

目前我在 控制器 中使用以下代码来查询数据库。此代码检查用户是否已设置其用户名。

$user = User::where('email', $userdata['email'])->first();

if(empty($user->username)){
    echo 'Set username here...';
} else {
    echo 'My home page!';
}

我的问题是,最好在User 模型中创建一个函数来执行此操作,还是保持原样。因此,例如,第一行将被删除,并且在 if 语句中它将调用模型函数,该函数将给出 true 或 false。

我最初的想法是这应该转移到模型函数中,因为 MVC 结构化项目应该有“胖模型”和“瘦控制器”。这是“业务逻辑”,因此应该在模型中。如果是这样,您能否举例说明我如何将其移至模型并从控制器调用该函数。

【问题讨论】:

  • 您绝对应该将所有与数据相关的代码移动到模型中。
  • @AlexeyMezenin 你能否举个例子说明我将如何做到这一点,我见过的大多数例子都在控制器中执行所有“业务逻辑”,我认为这是不好的做法。
  • 创建一个 Repository 来查询 Model 的数据。

标签: laravel model-view-controller laravel-5


【解决方案1】:

您绝对应该将所有与数据相关的代码移至模型。你问了一个例子。我会在模型中创建这个方法:

public function findByEmail($email)
{
    return $this->where('email', $email)->first();
}

在控制器中:

use App\User;

protected $user;

public function __construct(User $user)
{
    $this->user = $user;
}

public function showSomething($userdata)
{
    return view('some.view', [
        'user' => $this->user->findByEmail($userdata['email'])
    ]);
}

在视图中:

{{ empty($user->username) ? 'Hello anonymous' : $user->username }}

在此示例中,在模型中移动查询似乎不是一个好主意,但是当您的应用程序增长时,您会发现这是处理数据的唯一好方法。这是MVC。此外,您应该在 Request 类中保留验证逻辑,在它们自己的类中保留业务逻辑等。

【讨论】:

    【解决方案2】:

    您可以在 User.php 模型中编写如下函数:

    public function hasUsername()
    {
       if($this->username)
       {
          return true;
       } 
    
       return false;  
    }
    

    在你的控制器中你可以说:

    $user = User::where('email', $userdata['email'])->first();
    
    if($user->hasUsername()) 
    {
       // do somethin
    }
    

    【讨论】:

    • 当然这并没有取得多大的成就?
    • 对不起,如果它没有帮助。而且我认为做胖模型和瘦控制器会更好。
    【解决方案3】:

    型号

    public static function checkIfUsernameExists($email) {
    $user = User::where('email', $email)->first();
    
    if (empty($user->username)) {
      return true;
    } else {
      return false;
    }
    }
    

    控制器

    if(User::checkIfUsernameExists($userdata['email'])){
          echo 'Set username heree...';
        } else {
            echo 'My home page!';
        }
    

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 2012-02-09
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      相关资源
      最近更新 更多