Я так понимаю, что у вас один класс используется т.е. только Продукт?
Если да, то массовая работа и обновления проводятся так.
В контроллере:
public function actionUpdate()
{
// Тут получаете свой cat либо передаете каким либо образом.
$products = Product::find()->where('category_id'= $cat->id)->indexBy('id')->all();
if (Model::loadMultiple($products, Yii::$app->request->post()) && Model::validateMultiple($products)) {
foreach ($products as $product) {
$product->save(false);
}
return $this->redirect('index');
}
return $this->render('update', ['products' => $products]);
}
В виде
$form = ActiveForm::begin();
foreach ($products as $index => $product) {
echo $form->field($product, "[$index]value")->checkbox(['value' => $prod->title, 'label' => $prod->title]);
}
ActiveForm::end();
Если вы используете не одну модель и связанные вещи т.е. к пример как User и Profile, то вам нужна
Работа с несколькими моделями
К тому же, если вы работаете со свзями, можно использовать жадную загрузку. подгружая и связи таким образом
//получаете продукты и связи за один запрос.
$products = Product::find()->with('category', 'someTied')->all();
//или с условием
$products = Product::find()->with([
'categpry' => function ($query) {
$query->andWhere(['category_id' => 15]);
},
])->all();
Если вам нужно сохранить или обновить именно связные Id у разных объектов, есть метод link.