У меня есть эта база данных:
родители

| id |  name  |  
+----+--------+  
|  1 |  Paul  |  
|  2 |  Annet |

Дети

| id |    name   |  
+----+-----------+  
|  1 |  Micheal  |  
|  2 |   Susan   |

И сводная таблица parents_childs

| parent_id | child_id | custom_field_1 | custom_field_2 |  
+-----------+----------+----------------+----------------+  
|     1     |     1    |    value_1     |      (null)    |  
|     2     |     1    |  value_another |     value_3    |

И стандартное отношение belongsToMany

public function parents(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
    return $this->belongsToMany('\App\Parent', 'parents_childs', 'child_id', 'parent_id')
                ->withPivot(
                    'custom_field_1',
                    'custom_field_2'
                );
}

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

SET red_value FOR custom_field_2 WHERE child_id = 1 AND parent_id = 2

Как я могу это сделать без QueryBuilder?

3
Paul 29 Дек 2017 в 12:08

1 ответ

Лучший ответ

Из документации:

Если вам нужно обновить существующую строку в сводной таблице, вы можете использовать метод updateExistingPivot. Этот метод принимает внешний ключ сводной записи и массив атрибутов для обновления:

$child = Child::find($childId);
$child->parents()->updateExistingPivot($parentId, ['custom_field_2' => 'red_value']);

https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships

1
Alexey Mezenin 29 Дек 2017 в 09:11