#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
и использовать это для обновления каждого атрибута.