我正在尝试重新创建一个简单的博客功能,并允许管理员更新博客帖子。
我的问题是,在“缩略图”下的博客表中存储了名称的照片未正确更新。我保存一个新的帖子功能,但我的更新功能不起作用。
当您在不更新图像的情况下进行更新时,其他博客项目会更新但照片名称将设置为空白,如果您尝试更新图像,则照片会被移动,但数据库中的字段正在变为设置为临时位置(/ 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()
]);
}
我试图在该代码中说如果缩略图中有新文件,则创建一个唯一的名称,移动文件并将'thumbnail'设置为该名称(这就是我的创建函数的工作原理)但是如果没有上传文件到'thumbnail'然后将'thumbnail'设置为旧名称。
有没有更好的方法来处理这个过程?显然有因为这种方式不起作用。我只是在学习Laravel而且我有3本书,但没有一本涵盖如何做到这一点。
感谢。
答案 0 :(得分:2)
而不是$blog->update($input);
使用$blog->save();
。您已修改模型,只需保存即可。使用update()
方法,您传入的数组的所有键/值对都将分配给模型。
此外,您不需要其他情况。如果您不想更改模型属性,请不要这样做。如果您不想更改它,则无需明确指定值。
省略else
案例。
旁注:
手动分配模型属性,例如
$model = Model::find(5);
$model->prop = 'val';
$model->save();
在大多数情况下比Mass Assigning更好。例如
$model->find(5)->update($newvalues);
您可以更好地控制插入和更新的内容,当大量分配您必须处理将要分配的内容时,否则只需更改每个属性。这是一个安全问题。 (但laravel附带$guarded
和$fillable
)
同样在您的情况下,您不希望传递整个输入,因为如果它们没有更改,您可能不希望某些字段得到更新。因此,如果没有任何改变,您必须明确地排除您只需将整个输入传递给它时不想更新的键/值对(这是因为键存在但值为空)。
嗯,你明白我的意思。手动分配值时,您可以完全控制分配的时间和内容。
快乐的编码!