看起来这不是新问题。但我还没有发现任何真正的解决方案。 这是我的代码,预计它将起作用:
$update_pet=pets::where("pet_id",$pet['pet_id'])->get();
if($update_pet->count()>0){
$update_pet=$update_pet->first();
$update_pet->pet_breed_id=$pet_new['pet_breed_id'];
$update_pet->save();
}
我确信$ pet ['pet_id']和$ pet_new ['pet_breed_id']有价值。 我确信数据库中的table pet_breeds主键为pet_id。系统可以连接数据库,因为我可以获得pet_id和新的pet_breed_id。 我确信我在模型中覆盖了表名和primaryKey值。
class pets extends Model
{
protected $table="pets";
protected $primaryKey="pet_id";
}
它甚至没有更新。 现在我只是直接使用DB :: update()来运行更新查询来解决问题。 但我还是想知道为什么会这样?或者编码有问题吗?或者保存功能现在不能在更新情况下使用?
答案 0 :(得分:2)
为什么让事情变得复杂?
pets::find($pet['pet_id'])->update(['pet_breed_id' => $pet_new['pet_breed_id']]);
也要包括这一行:
protected $guarded = [];
或者这个:
protected $fillable = ['pet_breed_id'];
在您的宠物模型课程中。
最后一件事,你应该用资本开始你所有的班级名称。型号名称不应为复数。所以......
class Pet extends Model
答案 1 :(得分:1)
尝试获取对象而不是集合:
$pet = pets::find($pet['pet_id']);
if (!is_null($pet)) {
$update_pet->pet_breed_id = $pet_new['pet_breed_id'];
$update_pet->save();
}
此外,请确保通过在代码的第一行之后放置dd($pet);
来获得正确的对象。
答案 2 :(得分:1)
您只需要将get()更改为first(),这样它只会返回一个数据。
$update_pet=pets::where("pet_id",$pet['pet_id'])->first();
if($update_pet->count()>0){
$update_pet=$update_pet->first();
$update_pet->pet_breed_id=$pet_new['pet_breed_id'];
$update_pet->save();
}e
或者,如果您需要更新与where条件匹配的所有记录,请使用foreach
$update_pet=pets::where("pet_id",$pet['pet_id'])->get();
foreach ($update_pet as $pet) {
if($pet->count()>0){
$pet=$update_pet->first();
$pet->pet_breed_id=$pet_new['pet_breed_id'];
$pet->save();
}
}
答案 3 :(得分:0)
您使用get方法将结果作为数组提供,因此请勿使用第一种方法执行此操作。如果pet_id是您的主键。
$update_pet=pets::where("pet_id",$pet['pet_id'])->first();
if($update_pet->count()>0){
$update_pet=$update_pet->first();
$update_pet->pet_breed_id=$pet_new['pet_breed_id'];
$update_pet->save();
}
你在做什么样的东西$ update_pet->第3行的第一个。(