如何在 laravel 中以一对一的关系更新?

Posted

技术标签:

【中文标题】如何在 laravel 中以一对一的关系更新?【英文标题】:How to update in one to one relation in laravel? 【发布时间】:2020-02-18 05:39:11 【问题描述】:

在我的用户模型中,我有以下代码

public function profile()

    return $this->hasOne(UserProfile::class);

在配置文件模型中,

public function user()

   return $this->belongsTo(User::class);

create 方法正在运行,但是当我尝试使用以下代码更新配置文件时,它正在创建一个新配置文件并且不会更新配置文件信息。

$profile = new UserProfile();
$profile->dob = '1999-03-20';
$profile->bio = 'A professional programmer.';
$profile->facebook = 'http://facebook.com/test/1';
$profile->github = 'http://github.com/test/1';
$profile->twitter = 'http://twitter.com/test/1';

$user = User::find($userId);
$res = $user->profile()->save($profile);

在一对一关系中更新的正确方法是什么?

【问题讨论】:

【参考方案1】:

你做得对,但我可以建议一些改进

你可以使用以下

$user = User::with('profile')->findOrFail($userId);

if ($user->profile === null)

    $profile = new UserProfile(['attr' => 'value', ....]);
    $user->profile()->save($profile);

else

    $user->profile()->update(['attr' => 'value', ....]);

【讨论】:

感谢您对此的回复。但是,我不想使用数组。就像在 Laravel 文档中一样,如果记录已经退出,save 方法应该更新记录。【参考方案2】:

您正在使用 save 方法来保存新记录。使用更新查询

//controller
$userObj=new User();
if(!empty($userId) && $userId!=null)
$userObj->updateByUserId($userId,[
'dob' = '1999-03-20';
'bio' = 'A professional programmer.';
'facebook' = 'http://facebook.com/test/1';
'github' = 'http://github.com/test/1';
'twitter' = 'http://twitter.com/test/1';
]);


//model
function updateByUserId($userId,$updateArray)
return $this->where('user_id',$userId)->update($updateArray);

【讨论】:

【参考方案3】:

我使用push 方法修复了它。这是代码。

$user = User::find($userId);
$user->name = "Alen";
$user->profile->dob = '1999-03-20';
$user->profile->bio = 'A professional programmer.';
$user->profile->facebook = 'http://facebook.com/test/1';
$user->profile->github = 'http://github.com/test/1';
$user->profile->twitter = 'http://twitter.com/test/1';
$user->push();

【讨论】:

以上是关于如何在 laravel 中以一对一的关系更新?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent - 保存/更新相关的一对多关系数据

如何在核心数据中以一对多关系链接现有值?

在 Laravel 中同步一对多关系

如何使用 laravel+VueJS 以一对一的关系获取数据

如何在 Laravel 中从多对多关系的一对多关系中获取项目?

如何在 php Laravel 中的两个表之间创建一对多关系?