ArtemSV
@ArtemSV
Пытаюсь выучить php/mysql/Yii2

Как правильно сохранять связанные модели в yii2?

Есть модель User, которая связана с другой моделью Order
В User пишу следующее:
public function getOrders()
    {
		 return $this->hasMany(Order::className(), ['id' => 'order_id'])->viaTable('user_order', ['user_id' => 'id']);
    }


Как сохранить связи в таблицу user_order при сохранение user имея массив моделей order?

Требования такие:
- если в таблице user_order есть такая связь, то ее не трогать
- если не хватает, то добавить
- если при сохранении связь не указана, а в таблице user_order она есть, то ее нужно удалить

требования, наверно, очевидны.
Найти нужный метод не получилось, возможно как-то я не правильно искал, прошу вашей помощи!
  • Вопрос задан
  • 5159 просмотров
Пригласить эксперта
Ответы на вопрос 1
Frostealth
@Frostealth
Backend Developer
К сожалению, в yii2 пока нет синхронизации связей.

$orderKeys = [];
$relatedKeys = [];

foreach ($orders as $model) {
    $orderKeys[] = $model->getPrimaryKey();
}

// получаем айдишники уже связанных заказов
foreach ($user->getOrders()->all() as $model) {
    $relatedKeys[] = $model->getPrimaryKey();
}

// удаляем отсутствующие в $orderKeys связи
foreach (array_diff($relatedKeys, $orderKeys) as $id) {
    $model = Order::findOne($id);
    $user->unlink('orders', $model);
}

// добавляем новые связи
foreach (array_diff($orderKeys, $relatedKeys) as $id) {
    $model = Order::findOne($id);
    $user->link('orders', $model);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы