Yii2 вставить частичные данные в таблицу - PullRequest
1 голос
/ 23 января 2020

Я вставляю в таблицу данные, поступающие из другой таблицы, которая, по сути, является подмножеством первой таблицы.

 $partialProduct = partialProducts::find()
                 ->where(['company_id' => $company_id])
                 ->andWhere(['productName' => $productName])->one();

 $partialProductData = ($partialProductData['attributes']);

 $product = Yii::$app->db->createCommand()
                    ->insert('products', [
                        'field1' => $field1value,
                         ...
                         ...
                        'fieldN' => $fieldN,
                    ])->execute();

Что-то подобное может работать, но учитывая, что частичныйProductData имеет много полей, Я искал более чистый способ сделать это.

Я пробовал с подходом foreach(partialProductData as $key => $value), учитывая, что ключи названы как имена столбцов таблицы продуктов, но я изо всех сил пытался получить что-то жизнеспособное.

1 Ответ

1 голос
/ 23 января 2020

Как и предполагалось, создание массива пар ключ / значение должно работать, если ключи соответствуют полям таблицы в обеих моделях. Что-то вроде:

$data = [];
foreach($partialProduct->attributes as $key => $value):
  $data[$key] = $value;
endforeach;

$product = Yii::$app->db->createCommand()
  ->insert('products', $data)
  ->execute();

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

$product = new Product;
$product->attributes = $partialProduct->attributes;
$product->save();

Если вы хотите сохранить только некоторые поля из ваших частичных Продуктов в свой Продукт, вы можете использовать scenar ios для выбора указанных c полей, которые вы хотите установить с массовым присваиванием :

В продукте. php

const SCENARIO_TEST = 'test';

...

public function scenarios()
{
  return [
    self::SCENARIO_TEST => ['field_1', 'field_2'], // Any field not listed here will not be set
  ];
}

И где угодно вы делаете сохранение:

$product = new Product;
$product->scenario = Product::SCENARIO_TEST;
$product->attributes = $partialProduct->attributes;
$product->save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...