繁体   English   中英

Laravel用可选图像更新记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM