AUser
には 1 つ (または 0 つ) の がありCompany
、 はCompany
1 つの のみに属しますUser
。ユーザーの会社を保存しようとしましたが、保存メソッドを再トリガーするたびにデータベースに新しいエントリが追加されます。これは 1 対 1 の関係なので、 のsave
メソッドを考えましたUser
。
Company
1つの方法がありますuser()
:
public function user() {
return $this->belongsTo(User::class, 'user_id');
}
そして、User
1つの方法があります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