【问题标题】:Maintaining an MVC pattern, making database calls from model using PHPs Laravel 4维护 MVC 模式,使用 PHPs Laravel 4 从模型调用数据库
【发布时间】:2014-02-15 20:46:14
【问题描述】:

我正在尝试使用 Laravel 4 框架来维护 MVC 模式,在我的上一个项目中,我从控制器进行了所有数据库查询,我现在了解到这是一种糟糕的做法,我正试图弄清楚如何从模型做同样的事情。这是我通常会做的事情。

控制器

public function serve($company)
{
    $review = Review::select('head', 'body', 'logo', 'name')->where('company', '=', $company)->firstOrFail();

    return View::make('layouts.singlereview', compact('review'));
}

型号

class Review extends Eloquent {

protected $table = 'reviews';

protected $guarded = [
    'id', 'company', 'head', 'body'
    ];
}

当我将 $review 变量和数据库查询移动到模型中时,我会在未定义变量的视图上看到错误。如何将 $review 变量从模型传递到控制器?

谢谢!

【问题讨论】:

  • 感谢您发现间距错误@RobertRozas

标签: php orm laravel laravel-4 eloquent


【解决方案1】:

实际上,您仍然需要对控制器中的模型做一些事情。使用 Repository Pattern 这样做,这与在控制器中查询模型非常相似,但不那么冗长:

public function serve($company)
{
    return View::make('layouts.singlereview')->withReview(with(new Review)->getCompanyData($company));
}

并将整个逻辑放入您的存储库中:

class Review extends Eloquent {

     public function getCompanyData($company)
     {
         return static::select('head', 'body', 'logo', 'name')
                     ->where('company', '=', $company)
                     ->firstOrFail();
     }

}

【讨论】:

  • 除了不那么冗长之外,在这里使用存储库模式是否会对我的应用程序产生任何其他积极影响?这和我做的事情差不多,只是写的不同吗?
  • 它不仅不那么冗长还有一些好处,控制器更薄,控制器现在只知道它可以通过单一方法获得它需要的任何东西,并且 SOLID 的开放封闭原则已经到位,因为如果您的 Review 模型或您进行查询的方式发生变化,您不必更改控制器。
  • 实施您的解决方案后,模型中出现错误“未定义变量:公司”
  • 抱歉,刚刚编辑以传递您的公司变量。
  • 好的最后一个问题,现在我的原始变量已经不存在了,我如何从视图中访问数据?
【解决方案2】:

此外,当您关注创建优秀代码的主题时,不妨看看 Eloquent 关系。他们可能需要对某些情况进行数据库重组,但大多数时候你应该很好。

使用您提供的代码,我可以假设 review 和 company 是一对一的关系,所以一旦定义,您可以简单地检索一个 company 对象,然后执行,

$review = $company->review;

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多