2014-01-24 71 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;