{"id":3235,"date":"2025-03-24T08:46:37","date_gmt":"2025-03-23T23:46:37","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=3235"},"modified":"2025-03-24T08:47:07","modified_gmt":"2025-03-23T23:47:07","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel-upsert%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a13%e3%81%ae%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e5%ae%9f%e8%a3%85%e4%be%8b","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=3235","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel Upsert\u306e\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a13\u306e\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u4f8b\u3068\u6027\u80fd\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel Upsert\u3068\u306f\uff1a\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u307e\u3067<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306e\u65b0\u6a19\u6e96\uff1aUpsert\u306e\u4ed5\u7d44\u307f\u3068\u7279\u5fb4<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">\u5f93\u6765\u306e\u5b9f\u88c5\u65b9\u6cd5\u3068\u306e\u6bd4\u8f03\uff1a\u306a\u305cUpsert\u304c\u5fc5\u8981\u306a\u306e\u304b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">Upsert\u306e\u57fa\u672c\u5b9f\u88c5\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">\u30e2\u30c7\u30eb\u3067\u306eupsert\u30e1\u30bd\u30c3\u30c9\u306e\u4f7f\u3044\u65b9<\/a>      <\/li>      <li>        <a href=\"#i-5\">uniqueBy\u8a8d\u8a3c\u306e\u6b63\u3057\u3044\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-6\">\u66f4\u65b0\u5bfe\u8c61\u30ab\u30e9\u30e0\u306e\u6307\u5b9a\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-7\">\u5b9f\u8df5\u7684\u306aUpsert\u6d3b\u7528\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-8\">\u5927\u91cf\u30c7\u30fc\u30bf\u4e00\u62ec\u51e6\u7406\u3067\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u4ed8\u304d\u30c7\u30fc\u30bf\u306e\u7d71\u5408\u6027\u3092\u78ba\u7acb\u3059\u308bUpsert\u624b\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-10\">API\u304b\u3089\u306e\u30c7\u30fc\u30bf\u540c\u671f\u306b\u304a\u3051\u308b\u6d3b\u7528\u4f8b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-11\">Upsert\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-12\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306b\u3088\u308bUpsert\u51e6\u7406\u306e\u9ad8\u901f\u5316<\/a>      <\/li>      <li>        <a href=\"#i-13\">\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u3048\u305f\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u624b\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-15\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-16\">\u3088\u304f\u3042\u308bUpsert\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u30c7\u30d0\u30c3\u30b0\u306b\u4f7f\u3048\u308b\u30ed\u30b0\u51fa\u529b\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306b\u3088\u308b\u5b89\u5b9a\u6027\u306e\u78ba\u4fdd<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-19\">\u767a\u5c55\u7684\u306aUpsert\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">\u6761\u4ef6\u4ed8\u304dUpsert\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-21\">\u30ad\u30e5\u30fc\u6295\u5165\u306b\u3088\u308b\u975e\u540c\u671fUpsert\u51e6\u7406<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-22\">\u8907\u6570\u306e\u30c6\u30fc\u30d6\u30eb\u3092\u307e\u305f\u3050Upsert\u64cd\u4f5c\u306e\u8a2d\u8a08<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel Upsert\u3068\u306f\uff1a\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u307e\u3067<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306e\u65b0\u6a19\u6e96\uff1aUpsert\u306e\u4ed5\u7d44\u307f\u3068\u7279\u5fb4<\/h3>\n\n\n\n<p>Laravel\u306eUpsert\u306f\u3001\u65e2\u5b58\u30ec\u30b3\u30fc\u30c9\u306e\u66f4\u65b0\u3068\u65b0\u898f\u30ec\u30b3\u30fc\u30c9\u306e\u633f\u5165\u30921\u56de\u306e\u30af\u30a8\u30ea\u3067\u5b9f\u884c\u3067\u304d\u308b\u5f37\u529b\u306a\u6a5f\u80fd\u3067\u3059\u3002\u3053\u306e\u6a5f\u80fd\u306b\u3088\u308a\u3001\u8907\u96d1\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u3092\u7c21\u6f54\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u69cb\u6587\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Model::upsert([\n    ['id' =&gt; 1, 'name' =&gt; 'John', 'email' =&gt; 'john@example.com'],\n    ['id' =&gt; 2, 'name' =&gt; 'Jane', 'email' =&gt; 'jane@example.com']\n], ['email'], ['name']);<\/pre>\n\n\n\n<p>\u4e0a\u8a18\u306e\u30b3\u30fc\u30c9\u3067\u306f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7b2c1\u5f15\u6570\uff1a\u66f4\u65b0\u307e\u305f\u306f\u633f\u5165\u3059\u308b\u30c7\u30fc\u30bf\u306e\u914d\u5217<\/li>\n\n\n\n<li>\u7b2c2\u5f15\u6570\uff1a\u30e6\u30cb\u30fc\u30af\u5224\u5b9a\u306b\u4f7f\u7528\u3059\u308b\u30ab\u30e9\u30e0\uff08\u3053\u306e\u4f8b\u3067\u306f&#8217;email\u2019\uff09<\/li>\n\n\n\n<li>\u7b2c3\u5f15\u6570\uff1a\u66f4\u65b0\u5bfe\u8c61\u306e\u30ab\u30e9\u30e0\uff08\u3053\u306e\u4f8b\u3067\u306f\u2019name\u2019\uff09<\/li>\n<\/ul>\n\n\n\n<p>Upsert\u304c\u63d0\u4f9b\u3059\u308b\u4e3b\u306a\u30e1\u30ea\u30c3\u30c8\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u51e6\u7406\u306e\u81ea\u52d5\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b58\u5728\u30c1\u30a7\u30c3\u30af\u3068\u66f4\u65b0\/\u633f\u5165\u306e\u5224\u65ad\u3092\u81ea\u52d5\u3067\u884c\u3046<\/li>\n\n\n\n<li>\u958b\u767a\u8005\u304c\u6761\u4ef6\u5206\u5c90\u3092\u66f8\u304f\u5fc5\u8981\u304c\u306a\u3044<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5358\u4e00\u30af\u30a8\u30ea\u3067\u306e\u51e6\u7406\u306b\u3088\u308a\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a2\u30af\u30bb\u30b9\u3092\u6700\u5c0f\u5316<\/li>\n\n\n\n<li>\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u5b9f\u884c\u901f\u5ea6\u304c\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u306e\u6574\u5408\u6027\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5358\u4f4d\u3067\u306e\u51e6\u7406<\/li>\n\n\n\n<li>\u30ec\u30fc\u30b9\u30b3\u30f3\u30c7\u30a3\u30b7\u30e7\u30f3\u306e\u30ea\u30b9\u30af\u3092\u8efd\u6e1b<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u5f93\u6765\u306e\u5b9f\u88c5\u65b9\u6cd5\u3068\u306e\u6bd4\u8f03\uff1a\u306a\u305cUpsert\u304c\u5fc5\u8981\u306a\u306e\u304b<\/h3>\n\n\n\n<p>\u5f93\u6765\u306e\u30a2\u30d7\u30ed\u30fc\u30c1\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5b9f\u88c5\u304c\u4e00\u822c\u7684\u3067\u3057\u305f\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5f93\u6765\u306e\u65b9\u6cd5\nforeach ($records as $record) {\n    $model = Model::firstWhere('email', $record['email']);\n\n    if ($model) {\n        $model-&gt;update([\n            'name' =&gt; $record['name']\n        ]);\n    } else {\n        Model::create($record);\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u5b9f\u88c5\u65b9\u6cd5\u306b\u306f\u4ee5\u4e0b\u306e\u554f\u984c\u70b9\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u554f\u984c<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ec\u30b3\u30fc\u30c9\u3054\u3068\u306b\u500b\u5225\u306eSQL\u30af\u30a8\u30ea\u304c\u767a\u884c\u3055\u308c\u308b<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u91cf\u306b\u6bd4\u4f8b\u3057\u3066\u51e6\u7406\u6642\u9593\u304c\u5897\u52a0<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u306e\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\u304c\u5927\u304d\u3044<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4fe1\u983c\u6027\u306e\u554f\u984c<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u6570\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u540c\u6642\u306b\u5b9f\u884c\u3055\u308c\u305f\u5834\u5408\u306e\u30c7\u30fc\u30bf\u6574\u5408\u6027\u304c\u4fdd\u8a3c\u3055\u308c\u306a\u3044<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u767a\u751f\u6642\u306e\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u51e6\u7406\u304c\u8907\u96d1<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u88c5\u306e\u7169\u96d1\u3055<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6761\u4ef6\u5206\u5c90\u306b\u3088\u308b\u53ef\u8aad\u6027\u306e\u4f4e\u4e0b<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u30b3\u30fc\u30c9\u304c\u8907\u96d1\u5316<\/li>\n\n\n\n<li>\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30b3\u30b9\u30c8\u306e\u5897\u52a0<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u306b\u5bfe\u3057\u3001Upsert\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u88c5\u3067\u306f\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    Model::upsert($records, ['email'], ['name']);\n} catch (\\Exception $e) {\n    Log::error('Upsert failed: ' . $e-&gt;getMessage());\n    throw $e;\n}<\/pre>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u6539\u5584\u304c\u5f97\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30fc\u30c9\u306e\u7c21\u6f54\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6761\u4ef6\u5206\u5c90\u304c\u4e0d\u8981<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u304c\u7c21\u7d20\u5316<\/li>\n\n\n\n<li>\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u51e6\u7406\u306e\u52b9\u7387\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5358\u4e00\u306eSQL\u30af\u30a8\u30ea\u3067\u5b8c\u7d50<\/li>\n\n\n\n<li>\u30d0\u30eb\u30af\u51e6\u7406\u306b\u3088\u308b\u9ad8\u901f\u5316<\/li>\n\n\n\n<li>\u30b5\u30fc\u30d0\u30fc\u30ea\u30bd\u30fc\u30b9\u306e\u52b9\u7387\u7684\u306a\u5229\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4fe1\u983c\u6027\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306e\u81ea\u52d5\u7ba1\u7406<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u6574\u5408\u6027\u306e\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u6642\u306e\u4e00\u8cab\u6027\u4fdd\u6301<\/li>\n<\/ul>\n\n\n\n<p>Upsert\u306f\u7279\u306b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3067\u52b9\u679c\u3092\u767a\u63ee\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>API\u3092\u4ecb\u3057\u305f\u30c7\u30fc\u30bf\u540c\u671f\u51e6\u7406<\/li>\n\n\n\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u306b\u3088\u308b\u5927\u91cf\u30c7\u30fc\u30bf\u306e\u66f4\u65b0<\/li>\n\n\n\n<li>\u30de\u30b9\u30bf\u30fc\u30c7\u30fc\u30bf\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\u51e6\u7406<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30c7\u30fc\u30bf\u66f4\u65b0\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u57fa\u790e\u77e5\u8b58\u3092\u8e0f\u307e\u3048\u305f\u4e0a\u3067\u3001\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u624b\u9806\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">Upsert\u306e\u57fa\u672c\u5b9f\u88c5\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u30e2\u30c7\u30eb\u3067\u306eupsert\u30e1\u30bd\u30c3\u30c9\u306e\u4f7f\u3044\u65b9<\/h3>\n\n\n\n<p>Eloquent\u30e2\u30c7\u30eb\u3067upsert\u30e1\u30bd\u30c3\u30c9\u3092\u5b9f\u88c5\u3059\u308b\u969b\u306e\u57fa\u672c\u7684\u306a\u624b\u9806\u3092\u8aac\u660e\u3057\u307e\u3059\u3002\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u4f8b\u3068\u3057\u3066\u3001EC\u30b5\u30a4\u30c8\u306e\u5546\u54c1\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u60f3\u5b9a\u3057\u305f\u30b3\u30fc\u30c9\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Models\/Product.php\nclass Product extends Model\n{\n    protected $fillable = [\n        'sku',          \/\/ \u5546\u54c1\u30b3\u30fc\u30c9\n        'name',         \/\/ \u5546\u54c1\u540d\n        'price',        \/\/ \u4fa1\u683c\n        'stock',        \/\/ \u5728\u5eab\u6570\n        'category_id'   \/\/ \u30ab\u30c6\u30b4\u30eaID\n    ];\n\n    protected $casts = [\n        'price' =&gt; 'integer',\n        'stock' =&gt; 'integer',\n    ];\n}<\/pre>\n\n\n\n<p>upsert\u30e1\u30bd\u30c3\u30c9\u306e\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function updateProductInventory(array $products)\n{\n    return Product::upsert(\n        $products,          \/\/ \u66f4\u65b0\u30fb\u633f\u5165\u3059\u308b\u30c7\u30fc\u30bf\u306e\u914d\u5217\n        ['sku'],           \/\/ \u30e6\u30cb\u30fc\u30af\u5224\u5b9a\u306b\u4f7f\u7528\u3059\u308b\u30ab\u30e9\u30e0\n        ['price', 'stock'] \/\/ \u66f4\u65b0\u5bfe\u8c61\u306e\u30ab\u30e9\u30e0\n    );\n}\n\n\/\/ \u4f7f\u7528\u4f8b\n$inventoryData = [\n    [\n        'sku' =&gt; 'PROD-001',\n        'name' =&gt; '\u30c6\u30b9\u30c8\u5546\u54c1A',\n        'price' =&gt; 1000,\n        'stock' =&gt; 100\n    ],\n    [\n        'sku' =&gt; 'PROD-002',\n        'name' =&gt; '\u30c6\u30b9\u30c8\u5546\u54c1B',\n        'price' =&gt; 2000,\n        'stock' =&gt; 50\n    ]\n];\n\n$this-&gt;updateProductInventory($inventoryData);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">uniqueBy\u8a8d\u8a3c\u306e\u6b63\u3057\u3044\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<p>uniqueBy\u8a8d\u8a3c\u306f\u3001\u30ec\u30b3\u30fc\u30c9\u306e\u4e00\u610f\u6027\u3092\u4fdd\u8a3c\u3059\u308b\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u30d1\u30bf\u30fc\u30f3\u306b\u5fdc\u3058\u305f\u5b9f\u88c5\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5358\u4e00\u30ab\u30e9\u30e0\u3067\u306e\u8a8d\u8a3c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u8a2d\u5b9a\npublic function up()\n{\n    Schema::create('products', function (Blueprint $table) {\n        $table-&gt;id();\n        $table-&gt;string('sku')-&gt;unique(); \/\/ \u5358\u4e00\u30ab\u30e9\u30e0\u306e\u30e6\u30cb\u30fc\u30af\u5236\u7d04\n        $table-&gt;string('name');\n        $table-&gt;integer('price');\n        $table-&gt;integer('stock');\n        $table-&gt;timestamps();\n    });\n}\n\n\/\/ upsert\u3067\u306e\u4f7f\u7528\nProduct::upsert($products, ['sku'], ['price', 'stock']);<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8907\u5408\u30ad\u30fc\u3067\u306e\u8a8d\u8a3c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u8a2d\u5b9a\npublic function up()\n{\n    Schema::create('products', function (Blueprint $table) {\n        $table-&gt;id();\n        $table-&gt;string('sku');\n        $table-&gt;unsignedBigInteger('shop_id');\n        $table-&gt;string('name');\n        $table-&gt;integer('price');\n        $table-&gt;integer('stock');\n        $table-&gt;timestamps();\n\n        \/\/ \u8907\u5408\u30e6\u30cb\u30fc\u30af\u5236\u7d04\n        $table-&gt;unique(['sku', 'shop_id']);\n    });\n}\n\n\/\/ upsert\u3067\u306e\u4f7f\u7528\nProduct::upsert($products, ['sku', 'shop_id'], ['price', 'stock']);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u66f4\u65b0\u5bfe\u8c61\u30ab\u30e9\u30e0\u306e\u6307\u5b9a\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u66f4\u65b0\u5bfe\u8c61\u30ab\u30e9\u30e0\u306e\u6307\u5b9a\u306f\u3001\u30c7\u30fc\u30bf\u306e\u6574\u5408\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u76f4\u63a5\u5f71\u97ff\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3092\u6d3b\u7528\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u52d5\u7684\u306a\u66f4\u65b0\u30ab\u30e9\u30e0\u306e\u6307\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProductController extends Controller\n{\n    public function bulkUpdate(Request $request)\n    {\n        $updateColumns = collect(['name', 'price', 'stock'])\n            -&gt;filter(fn($column) =&gt; $request-&gt;has(\"update_{$column}\"))\n            -&gt;toArray();\n\n        if (empty($updateColumns)) {\n            throw new \\InvalidArgumentException('\u66f4\u65b0\u5bfe\u8c61\u306e\u30ab\u30e9\u30e0\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002');\n        }\n\n        return Product::upsert(\n            $request-&gt;products,\n            ['sku'],\n            $updateColumns\n        );\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u306e\u81ea\u52d5\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProductService\n{\n    public function bulkUpsertWithTimestamps(array $products)\n    {\n        $now = now();\n\n        $productsWithTimestamps = array_map(function ($product) use ($now) {\n            return array_merge($product, [\n                'updated_at' =&gt; $now,\n                'created_at' =&gt; $now\n            ]);\n        }, $products);\n\n        return Product::upsert(\n            $productsWithTimestamps,\n            ['sku'],\n            ['name', 'price', 'stock', 'updated_at']\n        );\n    }\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u691c\u8a3c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProductValidator\n{\n    public static function validateForUpsert(array $products): bool\n    {\n        $rules = [\n            '*.sku' =&gt; 'required|string|max:50',\n            '*.name' =&gt; 'required|string|max:255',\n            '*.price' =&gt; 'required|integer|min:0',\n            '*.stock' =&gt; 'required|integer|min:0'\n        ];\n\n        $validator = Validator::make($products, $rules);\n\n        if ($validator-&gt;fails()) {\n            throw new ValidationException($validator);\n        }\n\n        return true;\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    DB::beginTransaction();\n\n    \/\/ \u30c7\u30fc\u30bf\u691c\u8a3c\n    ProductValidator::validateForUpsert($products);\n\n    \/\/ upsert\u5b9f\u884c\n    Product::upsert($products, ['sku'], ['price', 'stock']);\n\n    DB::commit();\n} catch (ValidationException $e) {\n    DB::rollBack();\n    Log::warning('Validation failed: ' . $e-&gt;getMessage());\n    throw $e;\n} catch (\\Exception $e) {\n    DB::rollBack();\n    Log::error('Upsert failed: ' . $e-&gt;getMessage());\n    throw $e;\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u5b9f\u88c5\u3092\u7406\u89e3\u3057\u305f\u4e0a\u3067\u3001\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-7\">\u5b9f\u8df5\u7684\u306aUpsert\u6d3b\u7528\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u5927\u91cf\u30c7\u30fc\u30bf\u4e00\u62ec\u51e6\u7406\u3067\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306a\u30c7\u30fc\u30bf\u51e6\u7406\u3067\u306f\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u304c\u91cd\u8981\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u5b9f\u88c5\u4f8b\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u8ab2\u984c\u306b\u5bfe\u51e6\u3059\u308b\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class BulkUpsertService\n{\n    private const CHUNK_SIZE = 1000;\n    private const RETRY_COUNT = 3;\n\n    public function processBulkData(array $records)\n    {\n        $processedCount = 0;\n        $failedChunks = [];\n\n        \/\/ \u30c1\u30e3\u30f3\u30af\u5358\u4f4d\u3067\u306e\u51e6\u7406\n        foreach (array_chunk($records, self::CHUNK_SIZE) as $index =&gt; $chunk) {\n            try {\n                DB::beginTransaction();\n\n                \/\/ \u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5b9f\u884c\n                $this-&gt;processChunk($chunk);\n                $processedCount += count($chunk);\n\n                DB::commit();\n\n                \/\/ \u9032\u6357\u30ed\u30b0\n                Log::info(\"Processed chunk {$index}: {$processedCount} records completed\");\n\n            } catch (\\Exception $e) {\n                DB::rollBack();\n                $failedChunks[] = [\n                    'chunk_index' =&gt; $index,\n                    'error' =&gt; $e-&gt;getMessage()\n                ];\n                Log::error(\"Chunk {$index} failed: \" . $e-&gt;getMessage());\n            }\n        }\n\n        \/\/ \u5931\u6557\u3057\u305f\u30c1\u30e3\u30f3\u30af\u306e\u518d\u51e6\u7406\n        if (!empty($failedChunks)) {\n            $this-&gt;retryFailedChunks($failedChunks, $records);\n        }\n\n        return [\n            'processed' =&gt; $processedCount,\n            'failed' =&gt; count($failedChunks)\n        ];\n    }\n\n    private function processChunk(array $chunk)\n    {\n        \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\n        $preparedData = collect($chunk)\n            -&gt;map(fn($record) =&gt; $this-&gt;prepareRecord($record))\n            -&gt;toArray();\n\n        Product::upsert(\n            $preparedData,\n            ['sku'],\n            ['name', 'price', 'stock', 'updated_at']\n        );\n    }\n\n    private function retryFailedChunks(array $failedChunks, array $originalRecords)\n    {\n        foreach ($failedChunks as $failure) {\n            $chunkStart = $failure['chunk_index'] * self::CHUNK_SIZE;\n            $chunk = array_slice(\n                $originalRecords,\n                $chunkStart,\n                self::CHUNK_SIZE\n            );\n\n            \/\/ \u30ea\u30c8\u30e9\u30a4\u51e6\u7406\n            $retryCount = 0;\n            while ($retryCount &lt; self::RETRY_COUNT) {\n                try {\n                    DB::beginTransaction();\n                    $this-&gt;processChunk($chunk);\n                    DB::commit();\n                    break;\n                } catch (\\Exception $e) {\n                    DB::rollBack();\n                    $retryCount++;\n                    if ($retryCount === self::RETRY_COUNT) {\n                        Log::error(\"Final retry failed for chunk {$failure['chunk_index']}\");\n                        event(new ChunkProcessingFailedEvent($chunk, $e));\n                    }\n                    sleep(1); \/\/ \u30ea\u30c8\u30e9\u30a4\u9593\u9694\n                }\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u4ed8\u304d\u30c7\u30fc\u30bf\u306e\u7d71\u5408\u6027\u3092\u78ba\u7acb\u3059\u308bUpsert\u624b\u6cd5<\/h3>\n\n\n\n<p>\u95a2\u9023\u30c6\u30fc\u30d6\u30eb\u9593\u306e\u30c7\u30fc\u30bf\u6574\u5408\u6027\u3092\u4fdd\u3061\u306a\u304c\u3089Upsert\u3092\u5b9f\u884c\u3059\u308b\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class RelationalUpsertService\n{\n    public function upsertProductWithCategories(array $productsData)\n    {\n        DB::beginTransaction();\n        try {\n            \/\/ \u30ab\u30c6\u30b4\u30ea\u30c7\u30fc\u30bf\u306e\u62bd\u51fa\u3068\u66f4\u65b0\n            $categories = collect($productsData)\n                -&gt;pluck('category')\n                -&gt;unique()\n                -&gt;map(fn($name) =&gt; ['name' =&gt; $name])\n                -&gt;toArray();\n\n            \/\/ \u30ab\u30c6\u30b4\u30ea\u306eupsert\n            Category::upsert($categories, ['name'], []);\n\n            \/\/ \u30ab\u30c6\u30b4\u30eaID\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u53d6\u5f97\n            $categoryMap = Category::whereIn('name', array_column($categories, 'name'))\n                -&gt;pluck('id', 'name')\n                -&gt;toArray();\n\n            \/\/ \u5546\u54c1\u30c7\u30fc\u30bf\u306e\u6574\u5f62\n            $products = collect($productsData)-&gt;map(function ($item) use ($categoryMap) {\n                return [\n                    'sku' =&gt; $item['sku'],\n                    'name' =&gt; $item['name'],\n                    'price' =&gt; $item['price'],\n                    'stock' =&gt; $item['stock'],\n                    'category_id' =&gt; $categoryMap[$item['category']] ?? null,\n                    'updated_at' =&gt; now()\n                ];\n            })-&gt;toArray();\n\n            \/\/ \u5546\u54c1\u306eupsert\n            Product::upsert(\n                $products,\n                ['sku'],\n                ['name', 'price', 'stock', 'category_id', 'updated_at']\n            );\n\n            DB::commit();\n            return true;\n\n        } catch (\\Exception $e) {\n            DB::rollBack();\n            Log::error('Relational upsert failed: ' . $e-&gt;getMessage());\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">API\u304b\u3089\u306e\u30c7\u30fc\u30bf\u540c\u671f\u306b\u304a\u3051\u308b\u6d3b\u7528\u4f8b<\/h3>\n\n\n\n<p>\u5916\u90e8API\u3068\u306e\u30c7\u30fc\u30bf\u540c\u671f\u3092\u52b9\u7387\u7684\u306b\u884c\u3046\u305f\u3081\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ApiSyncService\n{\n    private $api;\n    private $lastSyncKey = 'product_sync_timestamp';\n\n    public function __construct(ExternalApiClient $api)\n    {\n        $this-&gt;api = $api;\n    }\n\n    public function syncProducts()\n    {\n        $lastSync = Cache::get($this-&gt;lastSyncKey);\n        $syncStart = now();\n\n        try {\n            \/\/ \u5dee\u5206\u30c7\u30fc\u30bf\u306e\u53d6\u5f97\n            $changes = $this-&gt;api-&gt;getProductChanges($lastSync);\n\n            if (empty($changes)) {\n                Log::info('No changes found since last sync');\n                return true;\n            }\n\n            \/\/ \u30c7\u30fc\u30bf\u306e\u6b63\u898f\u5316\n            $normalizedData = $this-&gt;normalizeApiData($changes);\n\n            \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u3067\u306eupsert\n            $result = $this-&gt;processBatchUpsert($normalizedData);\n\n            \/\/ \u540c\u671f\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u306e\u66f4\u65b0\n            Cache::put($this-&gt;lastSyncKey, $syncStart);\n\n            event(new ProductSyncCompletedEvent($result));\n            return $result;\n\n        } catch (ApiException $e) {\n            Log::error('API sync failed: ' . $e-&gt;getMessage());\n            event(new ProductSyncFailedEvent($e));\n            throw $e;\n        }\n    }\n\n    private function normalizeApiData(array $apiData): array\n    {\n        return collect($apiData)-&gt;map(function ($item) {\n            return [\n                'sku' =&gt; $item['product_code'],\n                'name' =&gt; $item['product_name'],\n                'price' =&gt; (int) $item['price'],\n                'stock' =&gt; (int) $item['inventory_count'],\n                'external_id' =&gt; $item['id'],\n                'synced_at' =&gt; now()\n            ];\n        })-&gt;toArray();\n    }\n\n    private function processBatchUpsert(array $data)\n    {\n        $result = [\n            'total' =&gt; count($data),\n            'processed' =&gt; 0,\n            'failed' =&gt; 0\n        ];\n\n        foreach (array_chunk($data, 500) as $chunk) {\n            try {\n                DB::beginTransaction();\n\n                Product::upsert(\n                    $chunk,\n                    ['external_id'],\n                    ['sku', 'name', 'price', 'stock', 'synced_at']\n                );\n\n                DB::commit();\n                $result['processed'] += count($chunk);\n\n            } catch (\\Exception $e) {\n                DB::rollBack();\n                $result['failed'] += count($chunk);\n                Log::error('Batch processing failed: ' . $e-&gt;getMessage());\n            }\n        }\n\n        return $result;\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u304a\u3051\u308b\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306b\u3088\u308b\u5927\u91cf\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406<\/li>\n\n\n\n<li>\u4e0d\u8981\u306a\u30c7\u30fc\u30bf\u306e\u89e3\u653e<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u6a5f\u69cb\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ed\u30b0\u8a18\u9332<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5229\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u6574\u5408\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u9069\u5207\u306a\u51e6\u7406<\/li>\n\n\n\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5883\u754c\u306e\u660e\u78ba\u5316<\/li>\n\n\n\n<li>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u5b9f\u88c5\u3092\u3055\u3089\u306b\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-11\">Upsert\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306b\u3088\u308bUpsert\u51e6\u7406\u306e\u9ad8\u901f\u5316<\/h3>\n\n\n\n<p>Upsert\u51e6\u7406\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306f\u3001\u9069\u5207\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306b\u5927\u304d\u304f\u4f9d\u5b58\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u52b9\u7387\u7684\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u3068\u305d\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u6700\u9069\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\npublic function up()\n{\n    Schema::create('products', function (Blueprint $table) {\n        $table-&gt;id();\n        $table-&gt;string('sku', 100);\n        $table-&gt;string('name');\n        $table-&gt;integer('price');\n        $table-&gt;integer('stock');\n        $table-&gt;unsignedBigInteger('category_id');\n        $table-&gt;timestamps();\n\n        \/\/ \u4e3b\u8981\u306a\u691c\u7d22\u30fb\u7d50\u5408\u6761\u4ef6\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f5c\u6210\n        $table-&gt;index('sku');\n        $table-&gt;index('category_id');\n\n        \/\/ \u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f5c\u6210\n        $table-&gt;index(['sku', 'category_id']);\n    });\n}\n\n\/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u6d3b\u7528\u3057\u305f\u30af\u30a8\u30ea\u306e\u4f8b\nclass ProductRepository\n{\n    public function bulkUpsertWithIndex(array $products)\n    {\n        \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u52b9\u679c\u7684\u306b\u4f7f\u7528\u3059\u308b\u305f\u3081\u306e\u30bd\u30fc\u30c8\n        $sortedProducts = collect($products)\n            -&gt;sortBy('sku')  \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u9806\u3067\u30bd\u30fc\u30c8\n            -&gt;values()\n            -&gt;toArray();\n\n        return Product::upsert(\n            $sortedProducts,\n            ['sku'],\n            ['name', 'price', 'stock']\n        );\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306aUpsert\u51e6\u7406\u3067\u306f\u3001\u9069\u5207\u306a\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OptimizedUpsertService\n{\n    private const CHUNK_SIZE = 1000;\n\n    public function performOptimizedUpsert(array $records)\n    {\n        \/\/ \u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u5bfe\u7b56\u306e\u305f\u3081\u306e\u30ed\u30c3\u30af\u53d6\u5f97\n        $lockKey = 'product_upsert_lock';\n\n        return Cache::lock($lockKey, 10)-&gt;block(5, function () use ($records) {\n            DB::beginTransaction();\n\n            try {\n                foreach (array_chunk($records, self::CHUNK_SIZE) as $chunk) {\n                    \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\n                    $memoryUsage = memory_get_usage(true);\n                    if ($memoryUsage &gt; 100 * 1024 * 1024) { \/\/ 100MB\u4ee5\u4e0a\u306e\u5834\u5408\n                        gc_collect_cycles(); \/\/ \u660e\u793a\u7684\u306a\u30ac\u30d9\u30fc\u30b8\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\n                    }\n\n                    Product::upsert($chunk, ['sku'], [\n                        'name', 'price', 'stock', 'updated_at'\n                    ]);\n                }\n\n                DB::commit();\n                return true;\n\n            } catch (\\Exception $e) {\n                DB::rollBack();\n                Log::error('Optimized upsert failed: ' . $e-&gt;getMessage());\n                throw $e;\n            }\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u3048\u305f\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u624b\u6cd5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u30e1\u30e2\u30ea\u7ba1\u7406\u3068\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class MemoryOptimizedUpsertService\n{\n    private const CHUNK_SIZE = 1000;\n    private $progressBar;\n\n    public function processLargeDataset(string $filepath)\n    {\n        $generator = $this-&gt;createDataGenerator($filepath);\n        $totalProcessed = 0;\n\n        foreach ($generator as $chunk) {\n            $result = $this-&gt;processChunkWithMemoryOptimization($chunk);\n            $totalProcessed += $result['processed'];\n\n            \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u72b6\u6cc1\u306e\u30ed\u30b0\u8a18\u9332\n            $this-&gt;logMemoryUsage();\n        }\n\n        return $totalProcessed;\n    }\n\n    private function createDataGenerator(string $filepath): \\Generator\n    {\n        $handle = fopen($filepath, 'r');\n        $headers = fgetcsv($handle);\n        $chunk = [];\n\n        while (($data = fgetcsv($handle)) !== false) {\n            $chunk[] = array_combine($headers, $data);\n\n            if (count($chunk) &gt;= self::CHUNK_SIZE) {\n                yield $chunk;\n                $chunk = [];\n            }\n        }\n\n        if (!empty($chunk)) {\n            yield $chunk;\n        }\n\n        fclose($handle);\n    }\n\n    private function processChunkWithMemoryOptimization(array $chunk): array\n    {\n        $result = [\n            'processed' =&gt; 0,\n            'failed' =&gt; 0\n        ];\n\n        try {\n            DB::beginTransaction();\n\n            \/\/ \u30c7\u30fc\u30bf\u306e\u6b63\u898f\u5316\u3068\u4e0d\u8981\u306a\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u524a\u9664\n            $optimizedChunk = collect($chunk)\n                -&gt;map(function ($record) {\n                    return array_intersect_key($record, array_flip([\n                        'sku', 'name', 'price', 'stock'\n                    ]));\n                })\n                -&gt;toArray();\n\n            Product::upsert(\n                $optimizedChunk,\n                ['sku'],\n                ['name', 'price', 'stock']\n            );\n\n            DB::commit();\n            $result['processed'] = count($optimizedChunk);\n\n        } catch (\\Exception $e) {\n            DB::rollBack();\n            $result['failed'] = count($chunk);\n            Log::error('Chunk processing failed: ' . $e-&gt;getMessage());\n        }\n\n        \/\/ \u660e\u793a\u7684\u306a\u30e1\u30e2\u30ea\u89e3\u653e\n        unset($optimizedChunk);\n        unset($chunk);\n\n        return $result;\n    }\n\n    private function logMemoryUsage(): void\n    {\n        $memoryUsage = memory_get_usage(true);\n        $peakMemory = memory_get_peak_usage(true);\n\n        Log::info(\"Memory Usage: \" . $this-&gt;formatBytes($memoryUsage) . \n                 \", Peak: \" . $this-&gt;formatBytes($peakMemory));\n    }\n\n    private function formatBytes($bytes): string\n    {\n        $units = ['B', 'KB', 'MB', 'GB'];\n        $bytes = max($bytes, 0);\n        $pow = floor(($bytes ? log($bytes) : 0) \/ log(1024));\n        $pow = min($pow, count($units) - 1);\n\n        return round($bytes \/ (1024 ** $pow), 2) . ' ' . $units[$pow];\n    }\n}<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306b\u304a\u3051\u308b\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08<\/li>\n\n\n\n<li>\u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u306e\u8003\u616e<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b8\u30a7\u30cd\u30ec\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u305f\u6bb5\u968e\u7684\u306a\u30c7\u30fc\u30bf\u8aad\u307f\u8fbc\u307f<\/li>\n\n\n\n<li>\u4e0d\u8981\u306a\u30c7\u30fc\u30bf\u306e\u660e\u793a\u7684\u306a\u89e3\u653e<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u5bfe\u7b56<\/li>\n\n\n\n<li>\u30ed\u30c3\u30af\u6a5f\u69cb\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u76e3\u8996\u3068\u30ed\u30ae\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u8a18\u9332<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u72b6\u6cc1\u306e\u8ffd\u8de1<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u767a\u751f\u6642\u306e\u8a73\u7d30\u306a\u30ed\u30b0\u8a18\u9332<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5927\u898f\u6a21\u306aUpsert\u51e6\u7406\u3067\u3082\u5b89\u5b9a\u3057\u305f\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u3088\u304f\u3042\u308bUpsert\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p>Upsert\u51e6\u7406\u3067\u767a\u751f\u3057\u304c\u3061\u306a\u30a8\u30e9\u30fc\u3068\u305d\u306e\u5bfe\u51e6\u6cd5\u3092\u5177\u4f53\u7684\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class UpsertErrorHandler\n{\n    public function handleUpsert(array $records)\n    {\n        try {\n            return $this-&gt;executeUpsert($records);\n        } catch (QueryException $e) {\n            \/\/ SQL\u30a8\u30e9\u30fc\u306e\u8a73\u7d30\u306a\u89e3\u6790\n            return $this-&gt;handleQueryException($e);\n        } catch (ValidationException $e) {\n            \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc\u306e\u51e6\u7406\n            return $this-&gt;handleValidationError($e);\n        } catch (\\Exception $e) {\n            \/\/ \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\n            return $this-&gt;handleUnexpectedError($e);\n        }\n    }\n\n    private function handleQueryException(QueryException $e)\n    {\n        $errorCode = $e-&gt;errorInfo[1];\n\n        switch ($errorCode) {\n            case 1062: \/\/ Duplicate entry\n                Log::warning('Duplicate key violation: ' . $e-&gt;getMessage());\n                throw new DuplicateKeyException(\n                    '\u30ec\u30b3\u30fc\u30c9\u304c\u91cd\u8907\u3057\u3066\u3044\u307e\u3059\u3002\u4e00\u610f\u5236\u7d04\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002',\n                    $e\n                );\n\n            case 1452: \/\/ Foreign key constraint\n                Log::error('Foreign key constraint violation: ' . $e-&gt;getMessage());\n                throw new ForeignKeyException(\n                    '\u95a2\u9023\u3059\u308b\u30ec\u30b3\u30fc\u30c9\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002',\n                    $e\n                );\n\n            default:\n                Log::error('Database error occurred: ' . $e-&gt;getMessage());\n                throw new DatabaseException(\n                    '\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002',\n                    $e\n                );\n        }\n    }\n\n    private function handleValidationError(ValidationException $e)\n    {\n        $errors = collect($e-&gt;errors())\n            -&gt;map(function ($messages, $field) {\n                return [\n                    'field' =&gt; $field,\n                    'messages' =&gt; $messages\n                ];\n            })\n            -&gt;values()\n            -&gt;toArray();\n\n        Log::warning('Validation failed: ' . json_encode($errors));\n\n        return [\n            'status' =&gt; 'error',\n            'type' =&gt; 'validation',\n            'errors' =&gt; $errors\n        ];\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30c7\u30d0\u30c3\u30b0\u306b\u4f7f\u3048\u308b\u30ed\u30b0\u51fa\u529b\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30ed\u30b0\u8a2d\u5b9a\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class UpsertLogger\n{\n    private const LOG_CHANNEL = 'upsert';\n\n    public function __construct()\n    {\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a\n        config(['logging.channels.' . self::LOG_CHANNEL =&gt; [\n            'driver' =&gt; 'daily',\n            'path' =&gt; storage_path('logs\/upsert.log'),\n            'level' =&gt; 'debug',\n            'days' =&gt; 14,\n        ]]);\n    }\n\n    public function logUpsertOperation(array $data, string $operation)\n    {\n        $context = [\n            'operation' =&gt; $operation,\n            'record_count' =&gt; count($data),\n            'memory_usage' =&gt; $this-&gt;getMemoryUsage(),\n            'timestamp' =&gt; now()-&gt;toIso8601String()\n        ];\n\n        Log::channel(self::LOG_CHANNEL)-&gt;info(\n            'Upsert operation executed',\n            $context\n        );\n    }\n\n    public function logPerformanceMetrics(float $startTime, int $processedCount)\n    {\n        $endTime = microtime(true);\n        $duration = $endTime - $startTime;\n\n        $metrics = [\n            'duration_seconds' =&gt; round($duration, 3),\n            'records_per_second' =&gt; round($processedCount \/ $duration, 2),\n            'total_records' =&gt; $processedCount,\n            'peak_memory' =&gt; $this-&gt;getMemoryUsage(true)\n        ];\n\n        Log::channel(self::LOG_CHANNEL)-&gt;info(\n            'Performance metrics',\n            $metrics\n        );\n    }\n\n    private function getMemoryUsage(bool $peak = false): string\n    {\n        $bytes = $peak ? memory_get_peak_usage(true) : memory_get_usage(true);\n        return round($bytes \/ 1024 \/ 1024, 2) . 'MB';\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306b\u3088\u308b\u5b89\u5b9a\u6027\u306e\u78ba\u4fdd<\/h3>\n\n\n\n<p>Upsert\u51e6\u7406\u306e\u4fe1\u983c\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u30c6\u30b9\u30c8\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProductUpsertTest extends TestCase\n{\n    use RefreshDatabase;\n\n    private $service;\n    private $logger;\n\n    protected function setUp(): void\n    {\n        parent::setUp();\n        $this-&gt;service = new ProductUpsertService();\n        $this-&gt;logger = new UpsertLogger();\n    }\n\n    \/** @test *\/\n    public function it_successfully_upserts_new_records()\n    {\n        \/\/ \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u6e96\u5099\n        $products = [\n            [\n                'sku' =&gt; 'TEST-001',\n                'name' =&gt; 'Test Product 1',\n                'price' =&gt; 1000\n            ],\n            [\n                'sku' =&gt; 'TEST-002',\n                'name' =&gt; 'Test Product 2',\n                'price' =&gt; 2000\n            ]\n        ];\n\n        \/\/ Upsert\u5b9f\u884c\n        $result = $this-&gt;service-&gt;upsert($products);\n\n        \/\/ \u30a2\u30b5\u30fc\u30b7\u30e7\u30f3\n        $this-&gt;assertTrue($result);\n        $this-&gt;assertDatabaseHas('products', [\n            'sku' =&gt; 'TEST-001',\n            'name' =&gt; 'Test Product 1'\n        ]);\n    }\n\n    \/** @test *\/\n    public function it_handles_duplicate_records_correctly()\n    {\n        \/\/ \u65e2\u5b58\u30ec\u30b3\u30fc\u30c9\u306e\u4f5c\u6210\n        Product::create([\n            'sku' =&gt; 'TEST-001',\n            'name' =&gt; 'Original Name',\n            'price' =&gt; 1000\n        ]);\n\n        \/\/ \u66f4\u65b0\u30c7\u30fc\u30bf\u306e\u6e96\u5099\n        $updateData = [\n            [\n                'sku' =&gt; 'TEST-001',\n                'name' =&gt; 'Updated Name',\n                'price' =&gt; 1500\n            ]\n        ];\n\n        \/\/ Upsert\u5b9f\u884c\n        $this-&gt;service-&gt;upsert($updateData);\n\n        \/\/ \u66f4\u65b0\u306e\u78ba\u8a8d\n        $this-&gt;assertDatabaseHas('products', [\n            'sku' =&gt; 'TEST-001',\n            'name' =&gt; 'Updated Name',\n            'price' =&gt; 1500\n        ]);\n    }\n\n    \/** @test *\/\n    public function it_handles_validation_errors()\n    {\n        \/\/ \u4e0d\u6b63\u306a\u30c7\u30fc\u30bf\u306e\u6e96\u5099\n        $invalidProducts = [\n            [\n                'sku' =&gt; '', \/\/ \u5fc5\u9808\u9805\u76ee\u306e\u6b20\u843d\n                'name' =&gt; 'Test Product',\n                'price' =&gt; -100 \/\/ \u4e0d\u6b63\u306a\u4fa1\u683c\n            ]\n        ];\n\n        \/\/ \u4f8b\u5916\u306e\u767a\u751f\u3092\u78ba\u8a8d\n        $this-&gt;expectException(ValidationException::class);\n\n        $this-&gt;service-&gt;upsert($invalidProducts);\n    }\n\n    \/** @test *\/\n    public function it_processes_large_datasets_efficiently()\n    {\n        \/\/ \u5927\u91cf\u30c7\u30fc\u30bf\u306e\u751f\u6210\n        $largeDataset = $this-&gt;generateLargeDataset(1000);\n\n        \/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a08\u6e2c\n        $startTime = microtime(true);\n        $result = $this-&gt;service-&gt;upsert($largeDataset);\n        $endTime = microtime(true);\n\n        \/\/ \u5b9f\u884c\u6642\u9593\u306e\u691c\u8a3c\n        $duration = $endTime - $startTime;\n        $this-&gt;assertLessThan(\n            10.0, \/\/ 10\u79d2\u4ee5\u5185\u306b\u5b8c\u4e86\u3059\u308b\u3053\u3068\n            $duration,\n            'Large dataset processing took too long'\n        );\n    }\n\n    private function generateLargeDataset(int $count): array\n    {\n        return array_map(function ($i) {\n            return [\n                'sku' =&gt; \"BULK-\" . str_pad($i, 6, '0', STR_PAD_LEFT),\n                'name' =&gt; \"Bulk Product {$i}\",\n                'price' =&gt; rand(100, 10000)\n            ];\n        }, range(1, $count));\n    }\n}<\/pre>\n\n\n\n<p>\u30c7\u30d0\u30c3\u30b0\u3068\u30c6\u30b9\u30c8\u306b\u304a\u3051\u308b\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5177\u4f53\u7684\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30bf\u30a4\u30d7\u306e\u9069\u5207\u306a\u5206\u985e<\/li>\n\n\n\n<li>\u4f8b\u5916\u306e\u968e\u5c64\u7684\u306a\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ed\u30b0\u8a18\u9332<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u69cb\u9020\u5316\u3055\u308c\u305f\u30ed\u30b0\u5f62\u5f0f<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u8a18\u9332<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u4fdd\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u30ab\u30d0\u30ec\u30c3\u30b8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u30c6\u30b9\u30c8<\/li>\n\n\n\n<li>\u30a8\u30c3\u30b8\u30b1\u30fc\u30b9\u306e\u691c\u8a3c<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u652f\u63f4<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u63d0\u4f9b<\/li>\n\n\n\n<li>\u30c8\u30ec\u30fc\u30b9\u60c5\u5831\u306e\u8a18\u9332<\/li>\n\n\n\n<li>\u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u30ed\u30b0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-19\">\u767a\u5c55\u7684\u306aUpsert\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u6761\u4ef6\u4ed8\u304dUpsert\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u7279\u5b9a\u306e\u6761\u4ef6\u306b\u57fa\u3065\u3044\u3066Upsert\u51e6\u7406\u3092\u5236\u5fa1\u3059\u308b\u9ad8\u5ea6\u306a\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ConditionalUpsertService\n{\n    public function upsertWithConditions(array $records, array $conditions)\n    {\n        return DB::transaction(function () use ($records, $conditions) {\n            $processingResults = [];\n\n            foreach ($records as $record) {\n                if ($this-&gt;shouldProcess($record, $conditions)) {\n                    $result = $this-&gt;processRecord($record);\n                    $processingResults[] = $result;\n                }\n            }\n\n            return $processingResults;\n        });\n    }\n\n    private function shouldProcess(array $record, array $conditions): bool\n    {\n        \/\/ \u4fa1\u683c\u5909\u66f4\u7387\u306e\u30c1\u30a7\u30c3\u30af\n        if (isset($conditions['max_price_change'])) {\n            $existingProduct = Product::where('sku', $record['sku'])-&gt;first();\n            if ($existingProduct) {\n                $priceChange = abs(\n                    ($record['price'] - $existingProduct-&gt;price) \/ $existingProduct-&gt;price * 100\n                );\n                if ($priceChange &gt; $conditions['max_price_change']) {\n                    Log::warning(\"Price change exceeds threshold for SKU: {$record['sku']}\");\n                    return false;\n                }\n            }\n        }\n\n        \/\/ \u5728\u5eab\u6570\u306e\u59a5\u5f53\u6027\u30c1\u30a7\u30c3\u30af\n        if (isset($conditions['min_stock'])) {\n            if ($record['stock'] &lt; $conditions['min_stock']) {\n                Log::warning(\"Stock below minimum threshold for SKU: {$record['sku']}\");\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    private function processRecord(array $record): array\n    {\n        try {\n            Product::upsert(\n                [$record],\n                ['sku'],\n                ['name', 'price', 'stock']\n            );\n\n            return [\n                'sku' =&gt; $record['sku'],\n                'status' =&gt; 'success',\n                'message' =&gt; 'Record processed successfully'\n            ];\n\n        } catch (\\Exception $e) {\n            return [\n                'sku' =&gt; $record['sku'],\n                'status' =&gt; 'error',\n                'message' =&gt; $e-&gt;getMessage()\n            ];\n        }\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\n$service = new ConditionalUpsertService();\n$conditions = [\n    'max_price_change' =&gt; 20,  \/\/ \u6700\u592720%\u306e\u4fa1\u683c\u5909\u66f4\u307e\u3067\u8a31\u5bb9\n    'min_stock' =&gt; 5           \/\/ \u6700\u5c0f\u5728\u5eab\u65705\u4ee5\u4e0a\u304c\u5fc5\u8981\n];\n\n$results = $service-&gt;upsertWithConditions($products, $conditions);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30ad\u30e5\u30fc\u6295\u5165\u306b\u3088\u308b\u975e\u540c\u671fUpsert\u51e6\u7406<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306aUpsert\u51e6\u7406\u3092\u975e\u540c\u671f\u3067\u5b9f\u884c\u3059\u308b\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Job\u30af\u30e9\u30b9\u306e\u5b9a\u7fa9\nclass ProcessUpsertJob implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    private $records;\n    private $batchId;\n    private $notifyEmail;\n\n    public function __construct(array $records, string $batchId, ?string $notifyEmail)\n    {\n        $this-&gt;records = $records;\n        $this-&gt;batchId = $batchId;\n        $this-&gt;notifyEmail = $notifyEmail;\n    }\n\n    public function handle()\n    {\n        $processor = new BatchUpsertProcessor();\n\n        try {\n            $result = $processor-&gt;process($this-&gt;records);\n\n            \/\/ \u51e6\u7406\u7d50\u679c\u306e\u4fdd\u5b58\n            UpsertBatch::create([\n                'batch_id' =&gt; $this-&gt;batchId,\n                'processed_count' =&gt; $result['processed'],\n                'failed_count' =&gt; $result['failed'],\n                'status' =&gt; 'completed'\n            ]);\n\n            \/\/ \u5b8c\u4e86\u901a\u77e5\n            if ($this-&gt;notifyEmail) {\n                Mail::to($this-&gt;notifyEmail)-&gt;send(\n                    new UpsertCompletedMail($result)\n                );\n            }\n\n        } catch (\\Exception $e) {\n            \/\/ \u30a8\u30e9\u30fc\u60c5\u5831\u306e\u8a18\u9332\n            UpsertBatch::create([\n                'batch_id' =&gt; $this-&gt;batchId,\n                'status' =&gt; 'failed',\n                'error_message' =&gt; $e-&gt;getMessage()\n            ]);\n\n            throw $e;\n        }\n    }\n\n    public function failed(\\Throwable $exception)\n    {\n        Log::error(\"Upsert job failed: {$exception-&gt;getMessage()}\");\n\n        if ($this-&gt;notifyEmail) {\n            Mail::to($this-&gt;notifyEmail)-&gt;send(\n                new UpsertFailedMail($this-&gt;batchId, $exception)\n            );\n        }\n    }\n}\n\n\/\/ \u30ad\u30e5\u30fc\u51e6\u7406\u306e\u5b9f\u88c5\nclass QueuedUpsertService\n{\n    private const CHUNK_SIZE = 1000;\n\n    public function queueUpsertJobs(array $records, string $notifyEmail = null)\n    {\n        $batchId = Str::uuid()-&gt;toString();\n\n        \/\/ \u30c1\u30e3\u30f3\u30af\u5358\u4f4d\u3067\u30b8\u30e7\u30d6\u3092\u4f5c\u6210\n        foreach (array_chunk($records, self::CHUNK_SIZE) as $chunk) {\n            ProcessUpsertJob::dispatch($chunk, $batchId, $notifyEmail)\n                -&gt;onQueue('upserts')\n                -&gt;delay(now()-&gt;addSeconds(rand(1, 30))); \/\/ \u8ca0\u8377\u5206\u6563\n        }\n\n        return $batchId;\n    }\n\n    public function checkBatchStatus(string $batchId): array\n    {\n        $batches = UpsertBatch::where('batch_id', $batchId)-&gt;get();\n\n        return [\n            'total_processed' =&gt; $batches-&gt;sum('processed_count'),\n            'total_failed' =&gt; $batches-&gt;sum('failed_count'),\n            'completed_chunks' =&gt; $batches-&gt;where('status', 'completed')-&gt;count(),\n            'failed_chunks' =&gt; $batches-&gt;where('status', 'failed')-&gt;count(),\n            'is_completed' =&gt; $batches-&gt;every(fn($batch) =&gt; \n                $batch-&gt;status === 'completed' || $batch-&gt;status === 'failed'\n            )\n        ];\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u8907\u6570\u306e\u30c6\u30fc\u30d6\u30eb\u3092\u307e\u305f\u3050Upsert\u64cd\u4f5c\u306e\u8a2d\u8a08<\/h3>\n\n\n\n<p>\u95a2\u9023\u30c6\u30fc\u30d6\u30eb\u9593\u306e\u6574\u5408\u6027\u3092\u4fdd\u3061\u306a\u304c\u3089Upsert\u51e6\u7406\u3092\u884c\u3046\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ComplexUpsertService\n{\n    public function upsertProductWithRelations(array $productData)\n    {\n        return DB::transaction(function () use ($productData) {\n            \/\/ \u30ab\u30c6\u30b4\u30ea\u306e\u51e6\u7406\n            $category = $this-&gt;upsertCategory($productData['category']);\n\n            \/\/ \u88fd\u9020\u5143\u306e\u51e6\u7406\n            $manufacturer = $this-&gt;upsertManufacturer($productData['manufacturer']);\n\n            \/\/ \u5546\u54c1\u306e\u51e6\u7406\n            $product = $this-&gt;upsertProduct(array_merge(\n                $productData['product'],\n                [\n                    'category_id' =&gt; $category-&gt;id,\n                    'manufacturer_id' =&gt; $manufacturer-&gt;id\n                ]\n            ));\n\n            \/\/ \u4fa1\u683c\u5c65\u6b74\u306e\u8a18\u9332\n            $this-&gt;recordPriceHistory($product, $productData['product']['price']);\n\n            \/\/ \u5728\u5eab\u60c5\u5831\u306e\u66f4\u65b0\n            $this-&gt;updateInventory($product, $productData['inventory']);\n\n            return $product;\n        });\n    }\n\n    private function upsertCategory(array $categoryData)\n    {\n        Category::upsert(\n            [$categoryData],\n            ['name'],\n            ['description', 'updated_at']\n        );\n\n        return Category::where('name', $categoryData['name'])-&gt;first();\n    }\n\n    private function upsertManufacturer(array $manufacturerData)\n    {\n        Manufacturer::upsert(\n            [$manufacturerData],\n            ['code'],\n            ['name', 'contact_info', 'updated_at']\n        );\n\n        return Manufacturer::where('code', $manufacturerData['code'])-&gt;first();\n    }\n\n    private function upsertProduct(array $productData)\n    {\n        Product::upsert(\n            [$productData],\n            ['sku'],\n            [\n                'name', 'price', 'category_id',\n                'manufacturer_id', 'updated_at'\n            ]\n        );\n\n        return Product::where('sku', $productData['sku'])-&gt;first();\n    }\n\n    private function recordPriceHistory(Product $product, float $price)\n    {\n        PriceHistory::create([\n            'product_id' =&gt; $product-&gt;id,\n            'price' =&gt; $price,\n            'recorded_at' =&gt; now()\n        ]);\n    }\n\n    private function updateInventory(Product $product, array $inventoryData)\n    {\n        Inventory::upsert(\n            [\n                'product_id' =&gt; $product-&gt;id,\n                'quantity' =&gt; $inventoryData['quantity'],\n                'warehouse_id' =&gt; $inventoryData['warehouse_id']\n            ],\n            ['product_id', 'warehouse_id'],\n            ['quantity', 'updated_at']\n        );\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\n$service = new ComplexUpsertService();\n\n$productData = [\n    'category' =&gt; [\n        'name' =&gt; 'Electronics',\n        'description' =&gt; 'Electronic devices and accessories'\n    ],\n    'manufacturer' =&gt; [\n        'code' =&gt; 'MFR-001',\n        'name' =&gt; 'Tech Corp',\n        'contact_info' =&gt; 'contact@techcorp.com'\n    ],\n    'product' =&gt; [\n        'sku' =&gt; 'PROD-001',\n        'name' =&gt; 'Smartphone X',\n        'price' =&gt; 89900\n    ],\n    'inventory' =&gt; [\n        'quantity' =&gt; 100,\n        'warehouse_id' =&gt; 1\n    ]\n];\n\n$result = $service-&gt;upsertProductWithRelations($productData);<\/pre>\n\n\n\n<p>\u767a\u5c55\u7684\u306a\u5b9f\u88c5\u306b\u304a\u3051\u308b\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6761\u4ef6\u4ed8\u304d\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d3\u30b8\u30cd\u30b9\u30eb\u30fc\u30eb\u306e\u7d44\u307f\u8fbc\u307f<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u306e\u59a5\u5f53\u6027\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u51e6\u7406\u306e\u67d4\u8edf\u306a\u5236\u5fa1<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u975e\u540c\u671f\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b8\u30e7\u30d6\u30ad\u30e5\u30fc\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u9032\u6357\u7ba1\u7406<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u518d\u8a66\u884c<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8907\u96d1\u306a\u30c7\u30fc\u30bf\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u7ba1\u7406<\/li>\n\n\n\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5236\u5fa1<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u306e\u6574\u5408\u6027\u78ba\u4fdd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u62e1\u5f35\u6027\u3068\u4fdd\u5b88\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3055\u308c\u305f\u8a2d\u8a08<\/li>\n\n\n\n<li>\u518d\u5229\u7528\u53ef\u80fd\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,12],"tags":[],"class_list":{"0":"post-3235","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php-laravel","7":"category-php","8":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3235"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3235\/revisions"}],"predecessor-version":[{"id":3237,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3235\/revisions\/3237"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}