我无法更新一个拥有" hasMany"关系。
我有一个这样的模型:
class UserGroup extends Model
{
public function enhancements()
{
return $this->hasMany('App\UserGroupEnhancement');
}
}
我的控制器将$ userGroup传递给视图,如下所示:
$userGroup = $this->userGroup->with('enhancements')->whereId($id)->first();
然后在我看来我有
@foreach($userGroup->enhancements as $enhancement)
<label>{{$enhancement->type}}</label>
<input class="form-control" name="enhancements[{{$enhancement->id}}][price]" value="{{$enhancement->price}}">
@endforeach
更新时,如何更新增强关系中的所有记录?它被传回多个阵列。我目前正在做这样的事情。
public function update($id)
{
$userGroup = $this->userGroup->findOrFail($id);
$enhancement = \Input::get('enhancements');
if (is_array($enhancement)) {
foreach ($enhancement as $enhancements_id => $enhancements_price) {
$userGroup->enhancements()->whereId($enhancements_id)->update($enhancements_price);
}
}
}
有没有办法可以在不需要foreach循环的情况下做到这一点?我看到了push()方法,但似乎只能在单个数组上工作。
答案 0 :(得分:1)
没有更好的方法来做到这一点。有一个名为saveMany
的Eloquent方法,但它用于创建新记录而不是更新。实施例Doc:
$comments = [
new Comment(['message' => 'A new comment.']),
new Comment(['message' => 'Another comment.']),
new Comment(['message' => 'The latest comment.'])
];
$post = Post::find(1);
$post->comments()->saveMany($comments);
我会坚持你的解决方案,你甚至可以创建一个特征或一个基本的Eloquent类,并将该逻辑放在一个方法中,以便所有其他模型可以使用它,如果你需要的话。 类似的东西:
trait UpdateMany {
public function updateMany($updates, $relationshipName)
{
if (!empty($updates)) {
foreach ($updates as $update_id => $update) {
$this->{$relationshipName}()->whereId($update_id)->update($update);
}
}
}
}
然后附加到您的模型:
class UserGroup extends Model
{
use UpdateMany;
public function enhancements()
{
return $this->hasMany('App\UserGroupEnhancement');
}
}
只需使用:
$userGroup = $this->userGroup->findOrFail($id);
$userGroup->updateMany(\Input::get('enhancements'), 'enhancements');