2014-01-31 35 views
1

我試圖重新創建一個簡單的博客功能並允許管理員更新博客文章。Laravel使用可選映像更新記錄

我的問題是在'縮略圖'下的博客表中存儲其名稱的照片沒有正確更新。我保存一個新的帖子功能,但我的更新功能不起作用。

當您在不更新圖像的情況下進行更新時,其餘博客項目會更新,但照片名稱會設置爲空白,如果您嘗試更新圖像,照片會移動但數據庫中的字段爲設置爲臨時位置(/ Applications/MAMP/tmp/php/phpx1jwMA)。

這可能是兩個單獨的問題。

在更新形式我添加了一個隱藏字段與照片名稱:

{{ Form::hidden('old_photo', $blog->thumbnail) }} 

和預期的一樣它產生這種形式:

<input name="old_photo" type="hidden" value="1391122313-2013 12 01_0567.JPG"> 

而且在我的控制器我有這樣的作爲我的更新功能:

public function update($id) { 
     $input = Input::all(); 

     $blog = Blog::find($id); 

     if(Input::hasFile('thumbnail')) { 

      $file = Input::file('thumbnail'); 

      $name = time() . '-' . $file->getClientOriginalName(); 

      $file = $file->move(public_path() . '/images/blog/', $name); 

      $blog->thumbnail = $name; 

     } 

     $blog->save(); 

     return View::make('admin.blog.index', [ 
      'blogs' => Blog::all() 
      ]); 
    } 

我想說的是,如果在thum中有一個新文件bnail然後創建一個獨特的名字,移動文件並將'縮略圖'設置爲該名稱(這就是我的創建函數的工作方式),但是如果沒有上傳文件到'縮略圖',則將'縮略圖'設置爲舊名稱。

有沒有更好的方法來處理這個過程?很明顯,因爲這種方式不起作用。我只是在學習Laravel,我有三本書,但沒有一本介紹如何做到這一點。

謝謝。

回答

2

而不是$blog->update($input);使用​​。您已經修改了模型,只需保存即可。使用update()方法,您傳遞的數組中的所有鍵/值對都將分配給模型。

你也不需要你的情況。如果您不想更改模型屬性,請不要這樣做。如果您不想更改它,則不需要明確分配值。 省略您的else個案。上

邊注:

分配模型屬性例如手動

$model = Model::find(5); 
$model->prop = 'val'; 
$model->save(); 

Mass Assigning他們更好例如大部分時間

$model->find(5)->update($newvalues); 

你有過得到什麼就會插入和更新的更多的控制權,當大規模分配要照顧什麼會被分配,否則只是每個屬性可以改變的。這是一個安全問題。 (但是laravel自帶$guarded$fillable

而且你的情況,你會不會想通過整個輸入,因爲你可能不希望,如果他們不改變某些領域得到更新。因此,如果沒有任何變化,您必須明確排除在您將整個輸入傳遞給它時(這是因爲鍵存在但值爲空)時您不想更新的鍵/值對。

你明白我的意思了。當您手動分配您的值時,您可以完全控制分配的時間和內容。

快樂編碼!

+0

謝謝,我按照你的建議,並更新了上面的代碼來匹配。照片現在可以正常工作,但如果進行了更改,則兩個文本字段不會立即更新。 –

+0

在您創建模型之後(在'$ blog = Blog :: find($ id);'之後)並在保存模型之前,您將musst分配給它們。只要做'$ blog-> mytextindb = Input :: get('mytextfield')' – thpl

+0

非常好,謝謝。現在我明白了。這整個MVC的東西很酷,但有時會令人困惑。 –