【问题标题】:stuck at laravel, trying to save data卡在laravel,试图保存数据
【发布时间】:2021-05-10 18:31:50
【问题描述】:

我正在尝试保存数据但收到此错误:

Illuminate\Database\Eloquent\Relations\HasOneOrMany::save(): 参数 #1 ($model) 必须是 Illuminate\Database\Eloquent\Model 类型,给定数组,在 C:\xampp\laravelprojects\testfrihand 中调用\app\Http\Controllers\ProfileController.php 第 52 行

这是保存数据的函数:

public function updateprofile(Request $request, Profile $about){
       auth()->user()->profile()->save([
        
            'about'=>$request->about,
            
        ]);

用户模型:

public function profile(){
        return $this->hasOne(\App\Models\Profile::class);
    }

我不确定错误是否在模型中。我认为这是因为它提到了关系。但是我在这里不知所措,因为如果我更改以创建它,由于某种原因它可以正常工作

【问题讨论】:

  • 欢迎来到 SO ... 如果您想通过关系“创建”新记录并传递属性,您正在寻找 create 方法,而不是 save ... 如果您是尝试更新此相关记录,您可以使用 update 但这取决于您是想使用 eloquent 还是绕过它来进行更新
  • 但我不想创建。这是针对用户配置文件的,因此他将插入只能更新而不是再次创建的数据
  • 只有在我创建了数据时更新才有效。据我了解,我需要使用 save
  • 如果您没有创建记录,那么您不是在“更新”您正在创建的记录
  • 我需要创建,但是用户不能创建很多abouts。我英语不好,我正在尽力解释。如果您登录您的帐户,您将有一个 about 字段。你写自己,这将被发送到数据库,如果他写在同一个领域,它将被更新而不是再次创建

标签: php laravel


【解决方案1】:

如果此时在您的代码中您可以保证该用户具有相关的个人资料记录,您可以通过关系检索该个人资料并对其进行更新:

auth()->user()->profile->update([...]);

如果用户可能还没有个人资料,您可以使用 updateOrCreate 之类的东西:

auth()->user()->profile()->updateOrCreate(
    [],
    ['about' => $request->about]
);

基本上是这样的:

auth()->user()->profile()->firstOrNew()->fill([...])->save();

【讨论】:

  • updateOrCreate 工作,谢谢!顺便问一下 save 和 updateorcreate 有什么区别?
  • 在关系上调用 save 期望传递相关的模型实例,因此调用 $user->profile()->save() 需要您将 Profile 模型传递给它... updateOrCreate 正在做针对关系的选择查询以找到匹配的记录,如果找到它会填充并保存它(更新),如果它没有找到它,它会使用这些属性创建一个......在关系上调用save 是不同于在模型上调用 save
  • @sta 在此示例中没有要搜索的属性,关系本身添加了确保该记录属于其父级所需的条件,所以这基本上是说让我获得第一个相关记录,因为将一个空数组传递给where 不添加任何条件
  • @sta 就是这样:auth()->user()->profile()->firstOrNew()->fill([...])->save() 基本上......好问题顺便说一句
  • @lagbox 很好的解释,谢谢。
【解决方案2】:

如果不存在,您可以使用 updateOrCreate 创建和/或如果存在则更新,

auth()->user()->profile()->updateOrCreate(['user_id'=>auth()->id()],[
    
        'about'=>$request->about,
        
    ]);

【讨论】:

  • 谢谢你!有效。我一整天都被困在这上面。对了,updateOrCreate和使用save有什么区别?
  • @CarlMenger save() 方法在你给它新模型实例时就像 INSERT ,即 ->save(new Profile(['key'=>'value])) 它也可以像 UPDATE当你给它现有的模型实例并更改一些道具时。 updateOrCreate 是一种同时检查这两种情况的简便方法
  • 感谢您的解释。我刚刚看到它既插入又更新,并认为它是正确的使用方法。谷歌了好几个小时,奇怪的是我从来没有遇到过 updateOrCreate
【解决方案3】:

问题是,保存方法接受对象而不是数组,然后您尝试将数组发送给它,所以您可以这样做:-

$profile = new Profile();
$profile->about = $request->about;
auth()->user()->profile()->save($profile); 

或者你可以使用这样的更新方法:-

auth()->user()->profile()->update([
        
            'about'=>$request->about,
            
        ]);

【讨论】:

  • 第一个答案给了我这个:函数 Illuminate\Database\Eloquent\Relations\HasOneOrMany::save() 的参数太少,在 C:\xampp\laravelprojects\testfrihand\app\Http 中传递了 0 \Controllers\ProfileController.php 位于第 52 行,预期为 1。而且我不想更新,因为我需要一个已经存在的记录
  • 试试这个,$profile = new Profile(); $profile->about = $request->about; auth()->user()->profile()->save($profile);在第二个解决方案中,您可以使用 firstOrNew()->fill()->save() 而不是 update 并告诉我结果
猜你喜欢
  • 2020-06-01
  • 2021-09-05
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
相关资源
最近更新 更多