porcelanosa писал(а): ↑2018.03.01, 16:34
По второму - ну это админка - не так это и критично. При обычной связи MANY-MANY тоже по-моему 2 запроса.
Так что пойдет.
при получении через with() 2 запроса на получение ВСЕХ связанных данных по второй связи, в вашем же случае для получения ОДНОЙ записи используется один запрос и для сохранения этой записи другой (ДЛЯ ВСЕХ ИМЕЮЩИХСЯ связей ) = 2*n запросов, а невозможность удаления вы просто проигнорировали
porcelanosa писал(а): ↑2018.03.01, 16:42
Ну отдельная страница - это не вариант. Неудобно даже мне будет, не то что пользователям.
По ссылке просто множественное добавление модели. Там речь не о связях.
отдельная страница иногда может упростить работу и понимание - все зависит от конкретики
по ссылке просто создание моделей - но приводилось как идея для динамического создания связей
porcelanosa писал(а): ↑2018.03.01, 16:45
Ну хотелось бы хотя бы фрагменты кода. По картинке не совсем ясно, как это работает.
Вообще проблема именно в сохранении.
это можно улучшить, написано было уже давно, а как известно - "Работает - не трогай!"
Код: Выделить всё
public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
if ($this->scenario == self::SCENARIO_SAVE_WITH_RELATION ){
$this->updateProperties();
}
}
protected function updateProperties()
{
$current = $this->getProductProperties()->asArray()->indexBy('property_id')->all();
$post = Yii::$app->request->post();
$new = (!empty($post['Product']['properties']) && is_array($post['Product']['properties']))
? $post['Product']['properties'] : [];
// insert rows
foreach (array_filter(array_diff_key($new, $current)) as $key => $item) {
$prod_prop = new ProductProperty(
array_merge(
['product_id' => $this->id,'property_id' => $key],
$item
)
);
$prod_prop->save();
}
// delete rows
if ($deleteProperties = array_filter(array_keys(array_diff_key($current, $new)))) {
ProductProperty::deleteAll([
'product_id' => $this->id,
'property_id' => $deleteProperties
]);
}
// update rows
foreach ($this->prop_diff($new, $current) as $key => $update){
ProductProperty::updateAll($update, ['product_id' => $this->id, 'property_id' => $key]);
}
}
protected function prop_diff(array $first, array $second)
{
$result = [];
foreach ($first as $key => $item) {
if(isset($second[$key])
&& ($item['value_id'] != $second[$key]['value_id'] || $item['in_list'] != $second[$key]['in_list'])){
$result[$key] = $item;
}
}
return $result;
}
а во вью используется движет основанный на
таком и значительно доработанном