web-dev-qa-db-ja.com

関連レコードをlaravelに保存する

ユーザーがいますが、ユーザーはディーラーに属しています。

ユーザー登録時に、新しいユーザーと新しいディーラーを保存しようとしています。

ユーザーデータベースには_dealership_id_列があり、新しく作成した販売店のIDを入力する必要があります。

これは、UserController storeメソッドの現在のコードです。

_public function store()
{
    $user = new User();
    $user->email = Input::get('email');
    $user->password = Input::get('password');


    $dealership = new Dealership();
    $dealership->name = Input::get('dealership_name');

    $user->Push();
    return "User Saved";

}
_

$user->Push();ユーザーデータを使用しようとすると、更新されますが、ディーラーは作成または更新されません。

38

EloquentのPush()はモデルとその関係を保存しますが、最初に関係に何を関与させたいかを伝えなければなりません。

あなたのユーザーモデル/テーブルはディーラーのIDを保持しているため、ユーザーは1つのディーラーのみに属することができると想定しているため、関係は次のようになります。

ユーザーモデル:

public function dealership()
{
  return $this->belongsTo('Dealership');
}

ディーラーモデル:

public function users()
{
  return $this->hasMany('User');
}

ディーラーの観点からユーザーを保存するには、次のようにします。

$dealership->users()->save($user);

ディーラーをユーザーに関連付けるには、次のようにします。

$user->dealership()->associate($dealership);
$user->save();
56
Quasdunk

この回答 をチェックして、Push()とsave()の違いを確認してください

モデルを正しく定義する必要があります ドキュメントごとの関係 これが正しく行われれば、動作するはずです。これはPush()が行うことです:

/**
 * Save the model and all of its relationships.
 *
 * @return bool
 */

    public function Push()
    {
        if ( ! $this->save()) return false;

        // To sync all of the relationships to the database, we will simply spin through
        // the relationships and save each model via this "Push" method, which allows
        // us to recurse into all of these nested relations for the model instance.

        foreach ($this->relations as $models)
        {
            foreach (Collection::make($models) as $model)
            {
                if ( ! $model->Push()) return false;
            }
        }

        return true;
    }

あなたの場合、あなたは1つ(ディーラー)が多く(ユーザー)に属している

ユーザーモデルで:

class Users extends Eloquent {

    public function dealership()
    {
        return $this->belongsTo('Dealership');

    }

}

上記の例では、EloquentはユーザーテーブルでディーラーシップID列を探します。ディーラーモデルで:

class Dealership extends Eloquent {

    public function users()
    {
        return $this->hasMany('User');
    }

}

ストア関数で:

 public function store()
    {
        $user = new User();
        $user->email = Input::get('email');
        $user->password = Input::get('password');


        $user->dealership = new Dealership();
        $user->dealership->name = Input::get('dealership_name');

        $user->Push();
        return "User Saved";

    }  

雄弁な関係 の詳細はこちら

また、 ここで私の答えを見てください

6
Paul Bele

これは私がそれをどうやってやるのかです。

コントローラーで:(Laravel 5)

use Auth;

$dealership->user = Auth::user()->ref_user->staff_id;

ユーザーモデルでプッシュを使用することにより、Laravelは基本的にすべての関連モデルでsaveを再帰的に呼び出します(この場合、まだ他のモデルを関連付けていないため、なしです) )。

したがって、あなたがしようとしていることを達成するために、最初にユーザーを作成し、次に以下を実行してディーラーをそれに関連付けることができます:

$user = new User();
$user->email = Input::get('email');
$user->password = Input::get('password');
$user->save();

$dealership = new Dealership();
$dealership->name = Input::get('dealership_name');

$user->dealerships()->save($dealership);
return "User Saved";

ただし、これを行う前に、ユーザーモデルとディーラーモデルの関係が正しく設定されていることを確認する必要があります。

ユーザーモデル:

public function dealership()
{
     return $this->belongsTo('Dealership');
}

ディーラーモデル:

public function users()
{
    return $this->hasMany('User');
}
1
seeARMS