web-dev-qa-db-ja.com

取得できませんLaravel仕事に関連付ける

Laravelの associate メソッドを理解しているかどうかはよくわかりません。私はその考えを理解していますが、うまくいくようには思えません。

この(蒸留された)コードでは:

_class User
{

    public function customer()
    {
        return $this->hasOne('Customer');
    }

}

class Customer
{

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

}

$user = new User($data);
$customer = new Customer($customerData);

$user->customer()->associate($customer);
_

これを実行しようとすると、Call to undefined method Illuminate\Database\Query\Builder::associate()が表示されます。

私が読むことができることから、私はドキュメントに記載されているとおりにそれを行います。

私は何を間違えていますか?

20
Matthijn

私が最初にLaravelを使い始めたとき、ドキュメントを一貫して参照しなければならなかった部分と、場合によってはそれが正しくなかったという関係を認めなければなりません。

支援するために、associate()を使用してbelongsTo()関係を更新します。コードを見ると、$user->customer()から返されるクラスはhasOneリレーションシップクラスであり、関連メソッドはありません。

逆方向にそれを行う場合。

_$user = new User($data);
$customer = new Customer($customerData);

$customer->user()->associate($user);
$customer->save();
_

$customer->user()belongsTo関係なので機能します。

他の方法でこれを行うには、最初にユーザーモデルを保存し、次に顧客モデルを次のように保存します。

_$user = new User($data);
$user->save();

$customer = new Customer($customerData);
$user->customer()->save($customer);
_

編集:最初にユーザーモデルを保存する必要はないかもしれませんが、私はいつもそうしましたが、理由はわかりません。

33
David Barker

私が理解しているように、->associate()はBelongsTo関係でonylを呼び出すことができます。したがって、あなたの例では、could do $customer->user()->associate($user)を実行します。ただし、Has *関係を「関連付ける」には->save()を使用するため、コードは$user->customer()->save($customer)である必要があります

5
alexrussell