Извлечение модели и обновление связанных с ней (полиморфных) моделей в Laravel 7

#php #eloquent #laravel-7

#php #красноречивый #laravel-7

Вопрос:

У меня есть 2 модели

Ресурс

 public function attributes()
{
    return $this->morphMany(Attribute::class, 'attributable');
}
  

Атрибут

 public function attributable()
{
    return $this->morphTo();
}
  

Я хотел бы получить ресурс и обновить его атрибуты, например…

 public function update(Request $request, Asset $asset){

    $array = [{id: 1, name:'foo', value: ''}, {id: 2, name: 'bar', value: ''}];
    //update should happen here
    $asset->attributes()->saveMany($array);
}
  

Я могу восстановить взаимосвязь, не беспокойтесь, но я знаю, что это не сработает, потому что saveMany () требует экземпляр модели в качестве своих аргументов. Итак, я попробовал это…

 foreach ($array as $a){
    $update = Attribute::find($a->id); ///<---this causes an error
    $update = Attribute::find($a['id']); ///<---this way as well  
}
  

Я знаю, что, должно быть, здесь не хватает чего-то действительно базового, но … есть ли красноречивый способ сделать это? Я безрезультатно очищал онлайн-документы. Любая помощь или руководство вообще были бы высоко оценены.

Комментарии:

1. Проблема решена: я использовал цикл foreach для выполнения итерации, подобной: foreach($asset->attributes as $attribute){ $array->firstWhere('id', $attribute->id; $attribute->update(['value' => $a['value'])); }

Ответ №1:

Во-первых, это недопустимо php ,

 $array = [{id: 1, name:'foo', value: ''}, {id: 2, name: 'bar', value: ''}];
  

Должно быть так:

 $array = [['id' => 1, 'name' => 'foo', 'value'=> ''], ['id'=> 2,'name'=> 'bar', 'value'=> '']];
  

Во-вторых, вы в основном запрашиваете, bulk update чего еще нет laravel .

Посмотрите на эту проблему, и там есть потенциальное решение.

Но что вы можете сделать, так это:

 foreach ($array as $a) {    
    $asset->attributes()->where('id', $a['id'])->update(unset($a['id']));
}
  

Комментарии:

1. Спасибо @Andy Song. Так получилось, что это то, что я получаю из интерфейса js. Я еще немного покопался и нашел несколько методов, которые здесь довольно удобны.

2. @ChrisMayers ваш вопрос заключается в желании обновить db, ссылка, которую вы нашли, — это коллекция laravel, которая не имеет ничего общего с db.

3. Извините, я не объяснил себя должным образом. Что я сделал, так это перебрал attributes (цикл foreach) и использовал firstWhere (найденный по ссылке, которую я отправил) метод на array , чтобы найти элемент с совпадением id и использовать это для обновления каждого атрибута.