Laravel 使用可选图像更新记录
Posted
技术标签:
【中文标题】Laravel 使用可选图像更新记录【英文标题】:Laravel Updating Record with optional image 【发布时间】:2014-01-31 11:43:24 【问题描述】:我正在尝试重新创建一个简单的博客功能并允许管理员更新博客文章。
我的问题是其名称存储在“缩略图”下的博客表中的照片未正确更新。我的保存新帖子功能有效,但我的更新功能不起作用。
当您在不更新图像的情况下进行更新时,其余博客项目会更新,但照片名称会设置为空白,如果您尝试更新图像,照片会移动但数据库中的字段会变设置为临时位置(/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' 设置为旧名称。
有没有更好的方法来处理这个过程?显然是因为这种方式行不通。我刚刚学习 Laravel,我有 3 本书关于它,但没有一本介绍如何做到这一点。
谢谢。
【问题讨论】:
【参考方案1】:使用$blog->save();
代替$blog->update($input);
。您已经修改了模型,只需保存它。使用update()
方法,您传入的数组的所有键/值对都将分配给模型。
你也不需要你的 else 案例。如果您不想更改模型属性,请不要这样做。如果您不想更改它,则不需要显式分配值。
省略您的 else
大小写。
旁注:
手动分配模型属性,例如
$model = Model::find(5);
$model->prop = 'val';
$model->save();
大部分时间都比Mass Assigning他们好,例如
$model->find(5)->update($newvalues);
您可以更好地控制插入和更新的内容,在批量分配时您必须注意要分配的内容,否则可能会更改每个属性。这是一个安全问题。 (不过laravel自带$guarded
和$fillable
)
在您的情况下,您也不想传递整个输入,因为如果某些字段没有更改,您可能不希望它们得到更新。因此,如果没有任何更改,您必须在将整个 Input 传递给它时明确排除您不想更新的键/值对(这是因为键存在但值是空的)。
你明白我的意思。当您手动分配值时,您可以完全控制分配的时间和内容。
编码愉快!
【讨论】:
谢谢,我按照你的建议做了并更新了上面的代码以匹配。照片现在可以正常工作,但如果进行更改,两个文本字段现在不会更新。 您必须在创建模型之后($blog = Blog::find($id);
之后)和保存模型之前分配它们。就做$blog->mytextindb = Input::get('mytextfield')
太好了,谢谢。现在我看到它是有道理的。整个 MVC 事情很酷,但有时会让人困惑。
没问题!一旦您习惯了它,它将使您作为开发人员的生活变得轻而易举。顺便说一句,它与 MVC 关系不大。 Eloquent 实现的模式称为 ORM,如果您想深入了解它!以上是关于Laravel 使用可选图像更新记录的主要内容,如果未能解决你的问题,请参考以下文章