Cześć. Mam problem związany z zapisywaniem danych w laravelu. Dane pobieram z api i pętlą zapisuje je w bazie danych. Problem w tym, że danych jest bardzo dużo... po wykonaniu pętli baza danych powinna mieć ok. 300000 rekordów. Gdy zapisuje po kolei tzn. najpierw kategorie, potem produkty a dopiero potem parametry do wszystko jest w porządku. Natomiast jak zrobie to w pętli tak jak w kodzie poniżej to wyskakuje błąd:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (
baza
.category_product
, CONSTRAINTcategory_product_category_id_foreign
FOREIGN KEY (category_id
) REFERENCEScategories
(id
) ON DELETE CASCADE) (SQL: insert intocategory_product
(category_id
,product_id
) values (0, 13356))
Kod (wywoływana funkcja to getAllProductsToDB()):
namespace App\Http\Controllers;
use App\Product;
use App\Param;
use App\Category;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function petla2($petla)
{
$client = new RestClient(config('app.apikey'));
$category = Category::firstOrCreate(
[
'id' => $petla->getId()
],
[
'name' => $petla->getName(),
'category_id' => $petla->getParentId()
]
);
if($petla->getArticleIdList())
{
$products = $client->getProducts($petla->getArticleIdList());
foreach($products as $product)
{
$newProduct = Product::firstOrCreate(
[
'id' => $product->getId()
],
[
'name' => $product->getName(),
'description' => $product->getDescription(),
'price' => $product->getPrice(),
'stockAvailability' => $product->getStockAvailability()
]
);
$newProduct->categories()->save($category);
if(!$product->getParams()->isEmpty())
{
foreach($product->getParams() as $param)
{
$newParam = Param::firstOrCreate(
[
'id' => $param->getId()
],
[
'name' => $param->getName()
]
);
$newProduct->params()->save($newParam,['value' => $param->getValue()]);
}
}
}
}
if(!$petla->getSubCategories()->isEmpty())
{
foreach($petla->getSubCategories() as $subCategory)
{
self::petla2($subCategory);
}
}
}
public function getAllProductsToDB()
{
$client = new RestClient(config('app.apikey'));
$tree = $client->getCategoryTree();
$mainCategory = Category::firstOrCreate(
['id' => $tree->getId()],
['name' => $tree->getName()]
);
foreach($tree->getSubCategories() as $category)
{
self::petla2($category);
}
}
}