2016-12-26 21 views
0

Eloquentで特定の注文のアイテムを更新する必要があります。 私は、このモデルを持っている:Laravel 5.3:Eloquent hasMany update

class Orders extends \Illuminate\Database\Eloquent\Model 
{ 

    public $timestamps = false; 

    protected $fillable = ['items_array']; 

    public function items() 
    { 
     return $this->hasMany(Items::class, 'order_id', 'order_id'); 
    } 

    public function setItemsArrayAttribute($data) 
    { 
     $this->items()->whereIn('article_id', array_map(function($item){ 
      return $item['article_id']; 
     }, $data['items']))->update($data); 
    } 

} 

class Items extends \Illuminate\Database\Eloquent\Model 
{ 
    protected $table = 'order_to_items'; 

    public $timestamps = false; 

    protected $fillable = ['internal_code']; 

    public function order() 
    { 
     return $this->belongsTo(Orders::class, 'order_id', 'order_id'); 
    } 
} 

私はそのようなAPIレスポンスを持っている:

$response = [ 
    'message'=>'some', 
    'order_id'=>'111-222-333', 
    'items'=>[ 
     [ 
      'article_id' => 'R-320108', 
      'internal_code' => 333 
     ], 
     [ 
      'article_id' => 'R-320116', 
      'internal_code' => 444 
     ], 

    ] 
]; 

だから私はこの

$order = Orders::where('order_id', $response['order_id'])->with('items')->first(); 

を作り、私はこれにしようとしました:

$order->update([ 
    'is_sent' => true, 
    'items_array' => $response['items'] 
]); 

buそれは動作しません。関連するモデルとAPIレスポンスを一致させて更新する方法はありますか?

ありがとうございます!

+0

は、特定のエラーがありますし、あなたのDBスキーマを提供してください? –

答えて

0

あなたはsave()を使用することができます。

$order->is_sent = true; 
$order->items_array = $response['items']; 
$order->save(); 

またはupdate()

$order = Orders::where('order_id', $response['order_id']) 
       ->update([ 
        'is_sent' => true, 
        'items_array' => $response['items'] 
       ]); 
+0

$ response ['items']配列に2つの項目があるため、動作しません。この場合、一致関数の部分があるかもしれません。 – Toletov

+0

@Toletovは、項目を繰り返し処理し、各項目を更新するだけです。 –

+0

http://stackoverflow.com/questions/43109293/updateing-one-to-many-relation-in-laravel-5-3 ここに質問のリンクをお願いします。 –