[英]Laravel Updating Record with optional image
我正在尝试重新创建简单的博客功能,并允许管理员更新博客文章。
我的问题是,名称已存储在博客表中“缩略图”下的照片未正确更新。 我保存新的帖子功能有效,但我的更新功能不起作用。
当您执行更新而不更新图像时,其余博客项目都会更新,但照片名称将设置为空白;如果您尝试更新图像,则照片会被移动,但是数据库中的字段已设置为临时位置(/ 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()
]);
}
我想在该代码中说,如果缩略图中有一个新文件,然后创建一个唯一的名称,请移动该文件,并将“缩略图”设置为该名称(这就是我的create函数的工作方式),但是如果存在没有上传文件到“缩略图”,然后将“缩略图”设置为旧名称。
是否有更好的方法来处理此过程? 显然是因为这种方式行不通。 我只是在学习Laravel,我手上有3本书,但是没有一本书涵盖如何做。
谢谢。
代替$blog->update($input);
使用$blog->save();
。 您已经修改了模型,只需保存即可。 使用update()
方法,您传递的数组的所有键/值对都将分配给模型。
另外,您不需要其他情况。 如果您不想更改模型属性,请不要这样做。 如果您不想更改值,则无需显式分配值。 省略else
情况。
旁注:
手动分配模型属性,例如
$model = Model::find(5);
$model->prop = 'val';
$model->save();
在大多数情况下要比批量分配更好,例如
$model->find(5)->update($newvalues);
您可以更好地控制要插入和更新的内容,在进行批量分配时, 您必须注意将要分配的内容,否则只能更改每个属性。 那是一个安全问题。 (但是laravel带有$guarded
和$fillable
fillable)
同样在您的情况下,您不希望传递整个输入,因为如果某些字段没有更改,您可能不希望它们被更新。 因此,如果什么都没有改变,则在将整个Input传递给键/值对时,您必须显式排除不想更新的键/值对(这是因为键存在,但值是空的)。
好吧,你明白我的意思。 手动分配值时,可以完全控制分配时间和分配的内容。
编码愉快!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.