2014-01-24 18 views
1

我试图维护一个使用Laravel 4框架的MVC模式,在我上一个项目中,我从控制器中完成所有数据库查询,现在我已经学会了这是一个可怕的做法,我试图找出如何从模型中做同样的事情。这是我通常会做的。维护MVC模式,使用PHP从模型进行数据库调用Laravel 4

控制器

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变量传递给控制器​​?

谢谢!

+0

感谢您捕获间距错误@RobertRozas –

回答

2

其实你仍然需要在你的控制器中用你的模型做一些事情。使用Repository模式做的话,这是非常类似的询问在你的控制器的车型,但被更简洁的:

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

} 
+0

如您所建议的,在这里使用存储库模式会对我的应用程序产生任何其他积极影响,而不是不那么冗长?这与我刚写的文章不一样吗? –

+1

这不仅仅是冗长的有几个好处,控制器更薄,控制器现在已经知道它可以通过单一方法获得所需的任何内容,并且SOLID的开放闭合原则已经就位,因为您没有如果您的评论模型或您的查询方式发生变化,请更改您的控制器。 –

+0

真棒谢谢你 –

0

此外,虽然你是在创造良好的代码的主题,你不妨检查出雄辩的关系。他们可能需要对某些事件进行数据库重组,但大多数情况下您应该很好。

随着你提供,我可以假设,审查和公司的代码是在一个一对一的关系,所以一旦这个定义,你可以简单地检索公司对象,然后做,

$review = $company->review;