Laravel 5.3: красноречивое обновление hasMany

Мне нужно обновить пункты для конкретного порядка с красноречивым.
У меня есть эта модель:

class Orders extends IlluminateDatabaseEloquentModel
{

    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 IlluminateDatabaseEloquentModel
{
    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']
]);

но это не работает. Есть ли способ сопоставить связанную модель с ответом API и сделать обновление?

Спасибо!

1 ответ

  1. Вы можете использовать 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']
                   ]);