web-dev-qa-db-ja.com

リレーションを含めた雄弁なオブジェクトの作成

私はoppsとlaravel両方に慣れていないので、usersprofilesテーブルに値を挿入するには、OneToOne関係、これは私のstore()メソッドがどのように見えるかです

_public function store(Requests\StoreNewUser $request)
{
    // crate an objct of user model
        $user = new \App\User;
        // now request and assign validated input to array of column names in user table
        $user->first_name = $request->input('first_name');
        $user->last_name = $request->input('last_name');
        $user->email = $request->input('email');
        $user->password = $request->input('password');
        /* want to assign request input to profile table's columns in one go 
        */
        $user->profile()->user_id = $user->id; // foreign key in profiles table
        $user->profile()->mobile_no = $request->input('mobile'); 
        dd($user); // nothing related to profile is returned
}
_

新しいレコードを作成しているため、dd()はプロファイルテーブルに関連するものを返しません。

これは、_$user_オブジェクトにデフォルトで関係が含まれていないためですか?はいの場合、関連する関係を含む_$user_オブジェクトをUserモデルに作成できますか?

または、各テーブルの2つの個別のオブジェクトとsave()データを作成する必要がありますか
しかし、Push()メソッドの意味は何ですか?

編集1 P.S.はい、関係はUserProfileモデルですでに定義されています

9
echoashu

次のようなことを試してみてください。最初に、次のように親モデルを保存します。

$user = new \App\User;
$user->first_name = $request->input('first_name');
// ...

$user->save();

次に、次のようなものを使用して関連モデルを作成して保存します。

$profile = new \App\Profile(['mobile_no' => $request->input('mobile')]);
$user->profile()->save($profile);

また、profileモデルにUserメソッドを作成したことを確認します。

public function profile()
{
    return $this->hasOne('App\Profile');
}
15
The Alpha

この回答を更新して、Laravel 5以降に適用できるようにする予定です。@ The Alphaの回答をベースとして使用します。

$profile = new \App\Profile(['mobile_no' => $request->input('mobile')]);
$user->profile()->associate($profile); // You can no longer call 'save' here
$user->profile()->save();

これは、saveリレーション(またはその他)でbelongsToを呼び出せなくなったためです。これにより、Illuminate\Database\Query\Builderのインスタンスが返されるようになりました。

5
Matt

これを行うためのクリーンな方法は、ユーザークラスファイルを使用することです。

public function profile()
{
    return $this->hasOne(App\Profile::class);
}

ユーザーコントローラーでは、次のストアメソッド:

public function store(Requests\StoreNewUser $request)
{
    $user = App\User::create(
        $request->only(
            [
                'first_name',
                'last_name',
                'email'
            ]
        )
    );

    $user->password = Illuminate\Support\Facades\Hash::make($request->password);
    //or $user->password = bcrypt($request->password);

    $user->profile()->create(
        [
            'mobile_no' =>  $request->mobile;
        ]
    );

    dd($user);
}

プレーンテキストのパスワードをデータベースに保存するのか、パスワード属性にミューテーターを使用するのかはわかりませんでした。

1
diegochaves

これは、$ userオブジェクトにデフォルトで関係が含まれていないためですか?はいの場合、関連付けられた関係を含む$ userオブジェクトをユーザーモデルに作成できますか

はい、関係を作成する必要があります。それらはdefaultに含まれていません。

Userモデルでは、次のような処理を行います。

public function profile()
{
    return $this->hasOne('App\Profile'); // or whatever your namespace is
}

これには、Profileモデルを作成する必要もあります。

これは、関連モデルの挿入に関する質問に間違いなく答えます。 http://laravel.com/docs/5.1/eloquent-relationships#inserting-related-models

Alphaが述べたように、そしてあなたも気づかなかったように、最初にユーザーモデルを保存してからvia関係を追加する必要があると思います。

0
haakym