Laravel使用可选图像更新记录

时间:2014-01-31 11:43:25

标签: php orm laravel eloquent

我正在尝试重新创建一个简单的博客功能,并允许管理员更新博客帖子。

我的问题是,在“缩略图”下的博客表中存储了名称的照片未正确更新。我保存一个新的帖子功能,但我的更新功能不起作用。

当您在不更新图像的情况下进行更新时,其他博客项目会更新但照片名称将设置为空白,如果您尝试更新图像,则照片会被移动,但数据库中的字段正在变为设置为临时位置(/ 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本书,但没有一本涵盖如何做到这一点。

感谢。

1 个答案:

答案 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

同样在您的情况下,您不希望传递整个输入,因为如果它们没有更改,您可能不希望某些字段得到更新。因此,如果没有任何改变,您必须明确地排除您只需将整个输入传递给它时不想更新的键/值对(这是因为键存在但值为空)。

嗯,你明白我的意思。手动分配值时,您可以完全控制分配的时间和内容。

快乐的编码!