维护MVC模式,使用PHP Laravel 4从模型进行数据库调用

时间:2014-01-24 18:25:51

标签: php orm laravel laravel-4 eloquent

我正在尝试使用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变量从模型传递给控制器​​?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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();
     }

}

答案 1 :(得分:0)

此外,当您谈到创建优秀代码时,您还可以查看Eloquent关系。他们可能需要对某些事件进行数据库重组,但大多数时候你应该做好。

使用您提供的代码,我可以假设审核和公司处于一对一的关系中,因此一旦定义了这个,您就可以简单地检索公司对象,然后执行,

$review = $company->review;