Yii2 将部分数据插入 table

Yii2 insert partial data into table

我正在插入来自另一个 table 的 table 数据,它基本上是第一个 table.

的子集
 $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();

类似的方法可行,但考虑到 partialProductData 有很多字段,我正在寻找一种更简洁的方法。

我尝试过 foreach(partialProductData as $key => $value) 方法,考虑到键被命名为产品 table 列名称,但我很难获得可行的东西。

如建议的那样,如果键与两个模型中的 table 字段匹配,则创建一个 key/values 对数组应该可行。类似于:

$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();

如果您只想将部分产品中的某些字段保存到您的产品中,您可以使用 scenarios to select the specific fields you want to be to set with massive assignment:

在Product.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();