Laravelで1対1の関係を保存する 質問する

Laravelで1対1の関係を保存する 質問する

AUserには 1 つ (または 0 つ) の がありCompany、 はCompany1 つの のみに属しますUser。ユーザーの会社を保存しようとしましたが、保存メソッドを再トリガーするたびにデータベースに新しいエントリが追加されます。これは 1 対 1 の関係なので、 のsaveメソッドを考えましたUser

Company1つの方法がありますuser():

public function user() {
    return $this->belongsTo(User::class, 'user_id');
}

そして、User1つの方法がありますcompany():

public function company() {
    return $this->hasOne(Company::class, 'user_id');
}

次のように (コントローラー内で) ユーザーの会社を保存 (つまり作成または更新) しようとしています。

$company = new Company();
$company->name = 'Test';
User::findOrFail(1)->company()->save($company);

このコードを初めて実行すると、データベースにエントリが作成されます (OK)。ただし、2 回目に実行すると、同じユーザーの新しいエントリが追加されます (NG)。データベース エントリのみが更新されると思っていました。

これはLaravelの不具合(または1対1の関係で理解できない何か)でしょうか?何か間違ったことをしているのでしょうか?(私はそれが2番目の目的だと信じています)

ベストアンサー1

作成と更新は異なる方法で処理する必要があります。そのため、まず会社属性の存在を確認してください。

$user = User::with('company')->findOrFail(1);
if ($user->company === null)
{
    $company = new Company(['name' => 'Test']);
    $user->company()->save($company);
}
else
{
    $user->company->update(['name' => 'Test']);
}

hasOne()1 対 1 の関係が保証されるわけではなく、単に Eloquent にクエリの作成方法を伝えるだけであることに注意してください。Company同じものを複数参照する場合でも機能しますUser。その場合、呼び出すと、データベースから結果データセットの$user->company最初のものが取得されます。Company

おすすめ記事