製品項目とスペック項目が一つになっているcsvファイルをインポートし、製品項目とスペック項目の値をそれぞれ、dbに登録したいと思っているのですが、スペック項目をnewEntitiesでsaveできる配列の形にすることができません。
db構造は
・製品テーブル(products)
・カテゴリーテーブル(categories)
・スペックテーブル(specs)
--- 中間テーブル ---
・categoriesproducts(カテゴリー/製品)
・specscategories(カテゴリー/スペック)
・specsproducts(製品/スペック)
製品項目は固定でスペック項目はカテゴリーによって項目が変わるので、製品とスペックの登録を分けてすることにしました。
↓製品登録時の処理です
php
1$save_product=[]; 2foreach($result as $key => $record){//csvファイルの配列 3 4 $csv_names=$this->config['product']; 5 if($key!=0){//ヘッダー以外を登録 6 foreach($csv_names as $csvkey => $record_names){//defineで定義した製品項目名 7 $save_products[$csvkey]=$record[$record_names];//項目名が一致したレコードを配列に入れる 8 } 9 $save_products['categories']['_ids'][0]=$scv_file['categories_id'];//カテゴリーidを変更する 10 11 $save_product[]=$save_products; 12 13 $save_data = $this->products->newEntities($save_product); 14 $product = $this->products->patchEntities($save_data, $save_product, [ 15 'associated' => [ 16 'Categories' 17 ] 18 ]); 19 }//if($key!=0) 20}//foreach($result as $key => $record)
この後、スペック項目の登録処理をします。
インポートしたスペック項目の配列($specresult)を登録分(ヘッダー以外
)foreachします。
スペックの数分配列を作ります。
php
1if($this->products->saveMany($product)){//製品が更新できたら 2 3 foreach($product as $p_id){//saveした製品id取得 4 $id[]=$p_id->id; 5 } 6 $import_spec=[]; 7 8 foreach($specresult as $speckey => $specsvalue ){//インポートしたスペックファイル 9 if($speckey!=0){//ヘッダー部分除く 10 $produtc_spec=[]; 11 12 foreach($specsvalue as $spec_values){//項目ごとに配列に入れる 13 if($spec_values!=""){ 14 $deleteflg=0; 15 }else{ 16 $deleteflg=1; 17 } 18 $lists=[]; 19 foreach($id as $ids){//登録した製品id 20 $list=[]; 21 //カテゴリーテーブルに紐付いたスペックのid($specid) 22 foreach($specid as $skey=> $spec_ids){ 23 $speccolum['spec_value']=$spec_values; 24 $speccolum['delete_flg']=$deleteflg; 25 $speccolum['category_id']=$scv_file['categories_id']; 26 $speccolum['product_id']=$ids;//製品id 27 $speccolum['spec_id']=$spec_ids;//スペックid 28 $list[]=$speccolum; 29 } 30 $lists[]=$list; 31 } 32 }//foreach($specsvalue as $spec_values) 33 $specs_product =$this->specs_products->newEntities($lists); 34 $product = $this->specs_products->saveMany($specs_product); 35 }//if($speckey!=0) 36 37 }// foreach($specresult as $speckey => $specsvalue ) 38}//if($this->products->saveMany($product)
newEntitiesする$produtc_specは下のような形で入って欲しのですが、
spec_valueの値が一つの製品で全部スペック1のtest1が、2つ目の製品では全部スペック2の値が入ってしまいます。
[
0=>[
'spec_value'=>'test1',
'delete_flg'=>'0',
'category_id'=>2,
'product_id'=>1,
'spec_id'=>1,
],
1->[
'spec_value'=>'',
'delete_flg'=>'0',
'category_id'=>2,
'product_id'=>1,
'spec_id'=>2,
]、
2->[
'spec_value'=>'test3',
'delete_flg'=>'0',
'category_id'=>2,
'product_id'=>1,
'spec_id'=>3,
]
]
配列が多すぎて、わかり辛くなってしまいました。
上のように$produtc_specに入れたいのですが、どうすればよいでしょうか...
かなり説明不足かもしれませんが、ご教示お願いします。
あなたの回答
tips
プレビュー