| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- <?php
- namespace App\Console\Commands;
- use App\Models\Product;
- use App\Models\ProductImage;
- use App\Models\ProductReview;
- use Illuminate\Http\Client\ConnectionException;
- class SearchProducts extends SearchDummyJson
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'app:get-products';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = 'Get products from DummyJSON';
- /**
- * Execute the console command.
- */
- public function handle(): void
- {
- try {
- $products = $this->getJson('products', 'iPhone');
- $this->upsertProducts($products);
- $this->info('Done!');
- } catch (ConnectionException $e) {
- $this->error('Error fetching data!');
- dump($e);
- }
- }
- /**
- * Prepare data and update or insert into DB
- * todo: need validation
- *
- * @param $products
- * @return void
- */
- protected function upsertProducts($products): void
- {
- foreach ($products as $product) {
- // remember foreign tables data
- $tags = $product['tags'];
- $reviews = $product['reviews'];
- $images = $product['images'];
- // move some subarray elements to root
- $product['width'] = $product['dimensions']['width'];
- $product['height'] = $product['dimensions']['height'];
- $product['depth'] = $product['dimensions']['depth'];
- $product['barcode'] = $product['meta']['barcode'];
- $product['qr_code'] = $product['meta']['qrCode'];
- // remove extra data
- unset($product['tags'], $product['reviews'], $product['images'], $product['dimensions'], $product['meta']);
- $product = $this->arrayKeysCamelToSnake($product);
- Product::query()->updateOrInsert(['id' => $product['id']], $product);
- $p = Product::find($product['id']);
- // detach all tags and attach received
- $p->tags()->detach();
- $p->tags()->attach($this->getTagsIds($tags));
- // delete all reviews and create from received
- ProductReview::query()->where('product_id', '=', $p->id)->delete();
- foreach ($reviews as $review) {
- $review['product_id'] = $p->id;
- ProductReview::query()->create($this->arrayKeysCamelToSnake($review));
- }
- // delete all images and create from received
- ProductImage::query()->where('product_id', '=', $p->id)->delete();
- foreach ($images as $image) {
- ProductImage::create(['product_id' => $p->id, 'url' => $image]);
- }
- }
- }
- }
|