英文:
Laravel / Livewire: Ignore "image" rule when updating
问题
简单来说,我必须更新用户。
这是我用于图像的验证规则:
protected $rules = [
//其他规则
"profile_image" => "sometimes|image|max:1024",
];
挂载方法:
public function mount($user)
{
//其他
$this->profile_image = $user->profile_image;
}
验证规则按预期工作,但问题是我将图像存储到数据库中作为字符串:示例如下 profile_image: "public/images/tprYt36hk0Ztun9yKBYpUGEX3TJuAaBWMi5bSkTZ.jpg"
这意味着当我想要更新用户而不更改配置文件图像时,我无法做到,因为 image
验证规则的存在,我只能在选择图像时才能通过。
这是我的更新方法:
public function updateCook()
{
$this->validate();
try {
$image = $this->profile_image->store("public/images");
$this->user->update([
//其他更新
"profile_image" => $image,
]);
session()->flash('success', '用户已更新');
} catch (\Exception $e) {
session()->flash('error', '发生错误');
}
}
如果我删除 image
验证规则并尝试提交没有上传新图像的表单,我会得到 Call to a member function store() on string。
英文:
Simply put, i have to update the user.
This is my validation rule for the image:
protected $rules = [
//other rules
"profile_image" => "sometimes|image|max:1024",
];
Mount method:
public function mount($user)
{
//other
$this->profile_image = $user->profile_image;
}
The validation rules work as expected, but the problem is i store the image into the database as a string: example of how it looks profile_image: "public/images/tprYt36hk0Ztun9yKBYpUGEX3TJuAaBWMi5bSkTZ.jpg"
This means that when i want to update the user without changing the profile image, i can't because of the image
validation rule, i can only pass when an image is selected.
This is how my update method looks:
public function updateCook()
{
$this->validate();
try {
$image = $this->profile_image->store("public/images");
$this->user->update([
//other updates
"profile_image" => $image,
]);
session()->flash('success', 'User is updated');
} catch (\Exception $e) {
session()->flash('error', 'An error occured');
}
}
If i remove the image
validation rule and try submitting the form without uploading a new image i get Call to a member function store() on string.
答案1
得分: 1
我猜你正在将 $this->profile_image
赋值为 $this->user->profile_image
。你不应该这样做,因为它们具有不同的类型。
public function mount($user)
{
//其他内容
//$this->profile_image = $user->profile_image;
}
如果你想在视图中显示图像,使用 $this->user->profile_image
。
对于 $rules
:
protected $rules = [
//其他规则
"profile_image" => "nullable|image|max:1024",
];
在 updateCook()
方法中:
//...
if ($this->profile_image) {
$image = $this->profile_image->store("public/images");
$this->user->update([
//其他更新
"profile_image" => $image,
]);
session()->flash('success', '用户已更新');
}
//...
英文:
I guess you are assigning $this->profile_image = $this->user->profile_image. You shouldn't do that because they have different types
public function mount($user)
{
//other
//$this->profile_image = $user->profile_image;
}
If you want show image in view, use $this->user->profile_image instead
For $rules:
protected $rules = [
//other rules
"profile_image" => "nullable|image|max:1024",
];
Within updateCook() method:
//...
if ($this->profile_image) {
$image = $this->profile_image->store("public/images");
$this->user->update([
//other updates
"profile_image" => $image,
]);
session()->flash('success', 'User is updated');
}
//..
.
答案2
得分: 0
我找到了一个答案:
protected $rules = [
"profile_image" => "nullable|image|max:1024",
];
然后,如@Khan Tran所说,我只是在`mount()`方法中删除了`$this->profile_image = $user->profile_image;`。
在我的`updateCook()`方法中,我做了这样的操作:
```php
public function updateCook()
{
$this->validate();
try {
if ($this->profile_image) {
$image = $this->profile_image->store("public/images");
$this->user->update([
// +其他更新
"profile_image" => $image,
]);
} else {
// 没有上传新图片,只更新其他字段
$this->user->update([
//其他更新
]);
}
session()->flash('success', '用户已更新');
} catch (\Exception $e) {
session()->flash('error', '更新用户时出错。');
}
}
英文:
I have found an answer:
protected $rules = [
"profile_image" => "nullable|image|max:1024",
];
Then as @Khan Tran said i simply removed $this->profile_image = $user->profile_image;
in the mount()
method
In my updateCook()
method i did this:
public function updateCook()
{
$this->validate();
try {
if ($this->profile_image) {
$image = $this->profile_image->store("public/images");
$this->user->update([
// + other updates
"profile_image" => $image,
]);
} else {
// No new image is uploaded, update other fields only
$this->user->update([
//Oter updates
]);
}
session()->flash('success', 'User is updated');
} catch (\Exception $e) {
session()->flash('error', 'Грешка при ажурирањето на корисникот.');
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论