2016-08-02 2 views
0

上にない場合、私は、ユーザーが保存したいときに私は私のコントローラでfindOrNew条件がID

function meta() { 
    return $this->hasOne('App\userMeta'); 
} 

を持っている私のusersモデルに2つのテーブルusersuser_meta

を持っている代わりに、オブジェクトの配列を返し、ユーザーメタ

function store(Request $request , $id = 0) {  
    $user = User::findOrNew($id); 
    $user->save() ; 

    $meta = UserMeta::findOrNew(['user_id'=>$id]); 
    $user->meta()->save($meta);  
} 

イムは、メタを保存しようと、私はこのエラー

を取得 を照らし\データベースに渡さ

引数1 \雄弁\リレーションズ\ HasOneOrMany ::セーブ() を照らし\ Databaseのインスタンス\雄弁\モデル、

にする必要があり、ここで返しUserMeta::findOrNew(['user_id'=>$id])問題がありますオブジェクトの代わりに配列... User::findOrNew($id)自体が返され、オブジェクト....私はそれが私の条件のbecuzだと思っています(2クエリの唯一の違い)

今私がしなければならないこのようなもの

$meta = UserMeta::findOrNew(['user_id'=>$id]); 
if(is_array($meta)) { 
    $user->meta()->save($meta[0]); 
} else { 
    $user->meta()->save($meta); 
} 

私は気に入らず、間違っています!

+0

おそらく 'UserMeta'は同じ' user_id'を持つ複数の行を持っています – jonju

+0

@jonjuいいえ1to1の関係ですので、データベースは同じuser_idを複数回受け入れません。 – hretic

+0

しかし、これはハズオーノの関係を1対1の関係ではありません。 – jonju

答えて

3

関数findOrNew()は、おそらくあなたが探しているものではありません。 次のように使用することが意図されています

// the array in the second parameter specifies which columns are 
// included in the resulting model (if found) 
// it is NOT used as a WHERE clause 
$meta = UserMeta::findOrNew($id, ['user_id'=>$id]); 

あなたが探しているもの:

この:firstOrNewは()あなたの場合には、単一のモデルを返さない理由

// adds where clause (returns new model if it does not exist) 
$meta = UserMeta::firstOrNew(['user_id' => $id]); 

// same as above but persists new model to database 
$meta = UserMeta::firstOrCreate(['user_id' => $id]); 

理由findOrNew Illuminate \ Database \ Eloquent \ Builder.phpの実装です。

public function findOrNew($id, $columns = ['*']) 
{ 
    if (! is_null($model = $this->find($id, $columns))) { 
     return $model; 
    } 

    return $this->model->newInstance(); 
} 

ご覧のとおり、最初のパラメータは列のためのものではありません。

あなたはます$ this-でfindメソッドを見ている場合>($ IDを、$列)を見つける あなたが表示されます。

public function find($id, $columns = ['*']) 
{ 
    if (is_array($id)) { 
     return $this->findMany($id, $columns); 
    } 

    $this->query->where($this->model->getQualifiedKeyName(), '=', $id); 

    return $this->first($columns); 
} 

あなたの$ IDとして配列を渡す結果$ this-> findMany()が返されます。これはCollectionです。

+0

私はfindOrNewのWHERE節を変更できませんか? – hretic

+0

IDで検索するか、主キー列名として定義したものだけで検索します –

1

おそらく、findOrNewの代わりにFirstOrCreateを使用する必要があります。

+0

のおかげであなたの問題を克服してくれることを願っています。これは計画B – hretic

+0

であると同時に、findOrNewは異なる動作をします。 OPによれば、それは1対1の関係です。 'user'の場合と同じように動作するはずです – jonju