{"id":3208,"date":"2025-03-24T08:46:40","date_gmt":"2025-03-23T23:46:40","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=3208"},"modified":"2025-03-24T08:47:10","modified_gmt":"2025-03-23T23:47:10","slug":"laravel-sql%e4%bb%98%e4%b8%8e%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b7%e3%81%a4%e3%81%ae%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e6%96%b9%e6%b3%95-%e7%8f%be%e5%a0%b4%e3%81%a7%e4%bd%bf%e3%81%88","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=3208","title":{"rendered":"Laravel SQL\u4ed8\u4e0e\u3092\u78ba\u8a8d\u3059\u308b7\u3064\u306e\u5b9f\u8df5\u7684\u306a\u65b9\u6cd5 &#8211; \u73fe\u5834\u3067\u4f7f\u3048\u308b\u5b8c\u5168\u30ac\u30a4\u30c9"},"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\u3067\u306e\u66f8\u304d\u8fbc\u307f\u30d3\u30eb\u30c0\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u66f8\u304d\u8fbc\u307f\u30d3\u30eb\u30c0\u3068Raw SQL\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">Laravel\u306e\u66f8\u304d\u8fbc\u307f\u30ed\u30b0\u306e\u4ed5\u7d44\u307f\u3092\u77e5\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">SQL\u66f8\u304d\u8fbc\u307f\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306e7\u3064\u306e\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">toSql()\u30e1\u30bd\u30c3\u30c9\u3067\u66f8\u304d\u8fbc\u307f\u3092\u5b9f\u884c\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-5\">DB::enableQueryLog() \u3067\u30ed\u30b0\u3092\u6709\u52b9\u306b\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-6\">debugbar \u3067\u52dd\u624b\u306b SQL \u3092\u76e3\u8996\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-7\">tinker \u3092\u4f7f\u3063\u3066\u66f8\u304f\u30c6\u30b9\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-8\">\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u3067 SQL \u3092\u8ffd\u8de1\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u30af\u30a8\u30ea\u30a4\u30d9\u30f3\u30c8\u3067 SQL \u3092\u30ea\u30c3\u30b9\u30f3\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-10\">\u5916\u90e8\u30c4\u30fc\u30eb\u3092\u4f7f\u3063\u3066 SQL \u3092\u5206\u6790\u3059\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-11\">\u5b9f\u8df5\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-12\">N+1 \u554f\u984c\u3092\u7279\u5b9a\u3057\u3066\u89e3\u6c7a\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-13\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u4f4e\u4e0b\u306e\u539f\u56e0\u3068\u306a\u308b\u6587\u7ae0\u3092\u898b\u3064\u3051\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">\u8907\u96d1\u306a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u30b7\u30c3\u30d7\u306e\u767a\u8a00\u3092\u78ba\u8a8d\u3059\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-15\">SQL\u66f8\u304d\u8fbc\u307f\u78ba\u8a8d\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-16\">\u958b\u767a\u74b0\u5883\u3067\u306e\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u672c\u756a\u74b0\u5883\u3067\u306e\u5b89\u5168\u306a\u691c\u8a3c\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u8a55\u4fa1\u30ec\u30d3\u30e5\u30fc\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-19\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">\u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-21\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u6587\u7ae0\u5206\u6790<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-22\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u306e\u767a\u898b\u3068\u5bfe\u7b56<\/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\u3067\u306e\u66f8\u304d\u8fbc\u307f\u30d3\u30eb\u30c0\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306f\u73fe\u4ee3\u306eWeb\u958b\u767a\u306b\u304a\u3044\u3066\u6700\u3082\u91cd\u8981\u306a\u8981\u7d20\u306e\u4e00\u3064\u3067\u3059\u3002Laravel\u306f\u5f37\u529b\u306a\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u3092\u63d0\u4f9b\u3057\u3066\u304a\u308a\u3001\u52b9\u7387\u7684\u304b\u3064\u5b89\u5168\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u306e\u57fa\u672c\u7684\u306a\u6982\u5ff5\u3068\u3001\u5b9f\u969b\u306eSQL\u30af\u30a8\u30ea\u304c\u3069\u306e\u3088\u3046\u306b\u751f\u6210\u3055\u308c\u308b\u304b\u3092\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u66f8\u304d\u8fbc\u307f\u30d3\u30eb\u30c0\u3068Raw SQL\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u3068Raw SQL\u306f\u3001\u305d\u308c\u305e\u308c\u306b\u7279\u5fb4\u3068\u4f7f\u3044\u5206\u3051\u306e\u30dd\u30a4\u30f3\u30c8\u304c\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u4e3b\u306a\u9055\u3044\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u306e\u7279\u5fb4<\/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=\"\">\/\/ \u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u3092\u4f7f\u7528\u3057\u305f\u4f8b\n$users = DB::table('users')\n    -&gt;where('age', '&gt;', 18)\n    -&gt;where('status', 'active')\n    -&gt;get();\n\n\/\/ \u751f\u6210\u3055\u308c\u308bSQL\n\/\/ SELECT * FROM users WHERE age &gt; ? AND status = ?<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7279\u5fb4\u7684\u306a\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30bd\u30c3\u30c9\u30c1\u30a7\u30fc\u30f3\u306b\u3088\u308b\u76f4\u611f\u7684\u306a\u8a18\u8ff0<\/li>\n\n\n\n<li>\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u30d0\u30a4\u30f3\u30c9\u304c\u81ea\u52d5\u3067\u884c\u308f\u308c\u308b<\/li>\n\n\n\n<li>SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56\u304c\u6a19\u6e96\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Raw SQL\u306e\u7279\u5fb4<\/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=\"\">\/\/ Raw SQL\u3092\u4f7f\u7528\u3057\u305f\u4f8b\n$users = DB::select('SELECT * FROM users WHERE age &gt; ? AND status = ?', [18, 'active']);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u305d\u308c\u305e\u308c\u306e\u30a2\u30d7\u30ed\u30fc\u30c1\u306e\u6bd4\u8f03\uff1a<\/p>\n\n\n<div id=\"id-20ba48d2-b605-4968-aa91-bf9c0dd30c9a\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6a5f\u80fd<\/th><th>\u30af\u30a8\u30ea\u30d3\u30eb\u30c0<\/th><th>Raw SQL<\/th><\/tr><\/thead><tbody><tr><td>SQL\u6587\u306e\u52d5\u7684\u751f\u6210<\/td><td>\u25cb<\/td><td>\u00d7<\/td><\/tr><tr><td>\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u30d0\u30a4\u30f3\u30c9<\/td><td>\u81ea\u52d5<\/td><td>\u624b\u52d5<\/td><\/tr><tr><td>SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56<\/td><td>\u81ea\u52d5<\/td><td>\u624b\u52d5<\/td><\/tr><tr><td>\u8907\u96d1\u306a\u30af\u30a8\u30ea\u306e\u53ef\u8aad\u6027<\/td><td>\u9ad8\u3044<\/td><td>\u4f4e\u3044<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u82e5\u5e72\u306e\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9<\/td><td>\u6700\u9069<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Laravel\u306e\u66f8\u304d\u8fbc\u307f\u30ed\u30b0\u306e\u4ed5\u7d44\u307f\u3092\u77e5\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel\u306e\u30af\u30a8\u30ea\u30ed\u30b0\u6a5f\u80fd\u306f\u3001\u958b\u767a\u6642\u306e\u30c7\u30d0\u30c3\u30b0\u306b\u975e\u5e38\u306b\u6709\u7528\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u30ed\u30b0\u6a5f\u80fd\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\u3092\u8aac\u660e\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ed\u30b0\u306e\u6709\u52b9\u5316\u3068\u53d6\u5f97<\/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=\"\">\/\/ \u30af\u30a8\u30ea\u30ed\u30b0\u306e\u6709\u52b9\u5316\nDB::enableQueryLog();\n\n\/\/ \u30af\u30a8\u30ea\u306e\u5b9f\u884c\n$users = User::where('status', 'active')-&gt;get();\n\n\/\/ \u30ed\u30b0\u306e\u53d6\u5f97\n$queries = DB::getQueryLog();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ed\u30b0\u306e\u8a2d\u5b9a<br><code>config\/database.php<\/code>\u3067\u30ed\u30b0\u306e\u8a73\u7d30\u5ea6\u3092\u8abf\u6574\u3067\u304d\u307e\u3059\uff1a<\/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=\"\">'mysql' =&gt; [\n    \/\/ ...\n    'logging' =&gt; [\n        'enabled' =&gt; env('DB_LOGGING', true),\n        'level' =&gt; env('DB_LOGGING_LEVEL', 'debug'),\n    ],\n],<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u30ed\u30b0\u306b\u306f\u4ee5\u4e0b\u306e\u60c5\u5831\u304c\u542b\u307e\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9f\u884c\u3055\u308c\u305fSQL\u30af\u30a8\u30ea\u306e\u6587\u5b57\u5217<\/li>\n\n\n\n<li>\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u305f\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u5024<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u306e\u5b9f\u884c\u6642\u9593\uff08\u30df\u30ea\u79d2\uff09<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u60c5\u5831\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5229\u70b9\u304c\u5f97\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a<\/li>\n\n\n\n<li>\u610f\u56f3\u3057\u306a\u3044\u30af\u30a8\u30ea\u306e\u691c\u51fa<\/li>\n\n\n\n<li>N+1\u554f\u984c\u306e\u65e9\u671f\u767a\u898b<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u3068\u30ed\u30b0\u6a5f\u80fd\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u3068\u30c7\u30d0\u30c3\u30b0\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">SQL\u66f8\u304d\u8fbc\u307f\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306e7\u3064\u306e\u65b9\u6cd5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u64cd\u4f5c\u3092\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306b\u306f\u3001Laravel\u304c\u5b9f\u969b\u306b\u5b9f\u884c\u3059\u308bSQL\u30af\u30a8\u30ea\u3092\u6b63\u78ba\u306b\u628a\u63e1\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002\u3053\u3053\u3067\u306f\u3001\u5b9f\u52d9\u3067\u5373\u5ea7\u306b\u6d3b\u7528\u3067\u304d\u308b7\u3064\u306e\u78ba\u8a8d\u65b9\u6cd5\u3092\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">toSql()\u30e1\u30bd\u30c3\u30c9\u3067\u66f8\u304d\u8fbc\u307f\u3092\u5b9f\u884c\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>toSql()<\/code>\u30e1\u30bd\u30c3\u30c9\u306f\u6700\u3082\u624b\u8efd\u306b\u30af\u30a8\u30ea\u3092\u78ba\u8a8d\u3067\u304d\u308b\u65b9\u6cd5\u3067\u3059\u3002\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u3084Eloquent\u30e2\u30c7\u30eb\u3067\u5229\u7528\u53ef\u80fd\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=\"\">\/\/ \u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\n$query = DB::table('users')\n    -&gt;where('status', 'active')\n    -&gt;where('age', '&gt;', 18);\n\n\/\/ SQL\u306e\u53d6\u5f97\n$sql = $query-&gt;toSql();\n\/\/ \u51fa\u529b: \"select * from `users` where `status` = ? and `age` &gt; ?\"\n\n\/\/ \u30d0\u30a4\u30f3\u30c9\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u78ba\u8a8d\n$bindings = $query-&gt;getBindings();\n\/\/ \u51fa\u529b: ['active', 18]\n\n\/\/ \u5b9f\u969b\u306e\u5024\u3092\u78ba\u8a8d\u3057\u305f\u3044\u5834\u5408\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3067\u304d\u307e\u3059\n$fullQuery = vsprintf(str_replace(['?'], ['\\'%s\\''], $sql), $bindings);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">DB::enableQueryLog() \u3067\u30ed\u30b0\u3092\u6709\u52b9\u306b\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30af\u30a8\u30ea\u30ed\u30b0\u306f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5168\u4f53\u3067\u306eSQL\u5b9f\u884c\u3092\u5305\u62ec\u7684\u306b\u628a\u63e1\u3059\u308b\u306e\u306b\u9069\u3057\u3066\u3044\u307e\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=\"\">\/\/ \u30ed\u30b0\u306e\u6709\u52b9\u5316\nDB::enableQueryLog();\n\n\/\/ \u8907\u6570\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\nUser::where('email', 'like', '%@example.com')-&gt;get();\nPost::latest()-&gt;take(5)-&gt;get();\n\n\/\/ \u30ed\u30b0\u306e\u53d6\u5f97\u3068\u5206\u6790\n$logs = DB::getQueryLog();\nforeach ($logs as $log) {\n    echo \"\u5b9f\u884c\u3055\u308c\u305fSQL: {$log['query']}\\n\";\n    echo \"\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u305f\u5024: \" . implode(', ', $log['bindings']) . \"\\n\";\n    echo \"\u5b9f\u884c\u6642\u9593: {$log['time']}ms\\n\\n\";\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">debugbar \u3067\u52dd\u624b\u306b SQL \u3092\u76e3\u8996\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel Debugbar\u306f\u958b\u767a\u6642\u306e\u5f37\u529b\u306a\u5473\u65b9\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=\"\"># \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30b3\u30de\u30f3\u30c9\ncomposer require barryvdh\/laravel-debugbar --dev\n\n# \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u516c\u958b\nphp artisan vendor:publish --provider=\"Barryvdh\\Debugbar\\ServiceProvider\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\uff08<code>config\/debugbar.php<\/code>\uff09\u3067\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\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=\"\">return [\n    'enabled' =&gt; env('DEBUGBAR_ENABLED', null),\n    'collectors' =&gt; [\n        'queries' =&gt; true,        \/\/ SQL\u30af\u30a8\u30ea\u306e\u53ce\u96c6\n        'time' =&gt; true,          \/\/ \u5b9f\u884c\u6642\u9593\u306e\u8a08\u6e2c\n        'memory' =&gt; true,        \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\n    ],\n    'options' =&gt; [\n        'sql_backtrace' =&gt; true, \/\/ SQL\u304c\u767a\u884c\u3055\u308c\u305f\u5834\u6240\u3092\u8ffd\u8de1\n        'backtrace_depth' =&gt; 50, \/\/ \u30d0\u30c3\u30af\u30c8\u30ec\u30fc\u30b9\u306e\u6df1\u3055\n    ],\n];<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">tinker \u3092\u4f7f\u3063\u3066\u66f8\u304f\u30c6\u30b9\u30c8<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tinker\u306f\u5bfe\u8a71\u7684\u306b\u30af\u30a8\u30ea\u3092\u30c6\u30b9\u30c8\u3067\u304d\u308b\u5f37\u529b\u306a\u30c4\u30fc\u30eb\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=\"\"># Tinker\u306e\u8d77\u52d5\nphp artisan tinker\n\n# \u30af\u30a8\u30ea\u306e\u30c6\u30b9\u30c8\u3068\u78ba\u8a8d\n&gt;&gt;&gt; $query = User::where('active', 1);\n&gt;&gt;&gt; $query-&gt;toSql();\n&gt;&gt;&gt; $query-&gt;getBindings();\n&gt;&gt;&gt; $users = $query-&gt;get();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u3067 SQL \u3092\u8ffd\u8de1\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c02\u7528\u306eSQL\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u8a73\u7d30\u306a\u5206\u6790\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\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=\"\">\/\/ config\/logging.php\n'channels' =&gt; [\n    'sql' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/sql\/sql.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n],\n\n\/\/ AppServiceProvider\u3067\u306e\u8a2d\u5b9a\npublic function boot()\n{\n    if (config('app.debug')) {\n        DB::listen(function($query) {\n            Log::channel('sql')-&gt;debug(sprintf(\n                'SQL: %s; Bindings: %s; Time: %sms',\n                $query-&gt;sql,\n                json_encode($query-&gt;bindings),\n                $query-&gt;time\n            ));\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30af\u30a8\u30ea\u30a4\u30d9\u30f3\u30c8\u3067 SQL \u3092\u30ea\u30c3\u30b9\u30f3\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30a4\u30d9\u30f3\u30c8\u30ea\u30b9\u30ca\u30fc\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u7279\u5b9a\u306e\u6761\u4ef6\u3067\u306e\u307f\u30ed\u30b0\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\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=\"\">\/\/ AppServiceProvider\u306b\u8ffd\u52a0\npublic function boot()\n{\n    DB::listen(function($query) {\n        \/\/ \u5b9f\u884c\u6642\u9593\u304c100ms\u4ee5\u4e0a\u306e\u30af\u30a8\u30ea\u306e\u307f\u30ed\u30b0\u51fa\u529b\n        if ($query-&gt;time &gt; 100) {\n            Log::warning('\u30b9\u30ed\u30fc\u30af\u30a8\u30ea\u3092\u691c\u51fa:', [\n                'sql' =&gt; $query-&gt;sql,\n                'bindings' =&gt; $query-&gt;bindings,\n                'time' =&gt; $query-&gt;time,\n                'connection' =&gt; $query-&gt;connectionName\n            ]);\n        }\n    });\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u5916\u90e8\u30c4\u30fc\u30eb\u3092\u4f7f\u3063\u3066 SQL \u3092\u5206\u6790\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u306a\u5206\u6790\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u30c4\u30fc\u30eb\u304c\u52b9\u679c\u7684\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Laravel Telescope<\/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=\"\"># \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncomposer require laravel\/telescope --dev\nphp artisan telescope:install\nphp artisan migrate<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Clockwork<\/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=\"\"># \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncomposer require itsgoingd\/clockwork --dev<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>MySQL Workbench<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30ed\u30fc\u30af\u30a8\u30ea\u30ed\u30b0\u306e\u6709\u52b9\u5316\uff1a<\/li>\n<\/ul>\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=\"\">SET GLOBAL slow_query_log = 'ON';\nSET GLOBAL long_query_time = 1;\nSET GLOBAL slow_query_log_file = '\/var\/log\/mysql\/slow-query.log';<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u30c4\u30fc\u30eb\u3092\u72b6\u6cc1\u306b\u5fdc\u3058\u3066\u4f7f\u3044\u5206\u3051\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306aSQL\u30af\u30a8\u30ea\u306e\u5206\u6790\u3068\u6700\u9069\u5316\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u7279\u306b\u672c\u756a\u74b0\u5883\u306b\u8fd1\u3044\u958b\u767a\u74b0\u5883\u3067\u306e\u691c\u8a3c\u306b\u306f\u3001\u5916\u90e8\u30c4\u30fc\u30eb\u306e\u6d3b\u7528\u304c\u63a8\u5968\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-11\">\u5b9f\u8df5\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u52b9\u7387\u7684\u306aSQL\u306e\u30c7\u30d0\u30c3\u30b0\u306b\u306f\u3001\u4f53\u7cfb\u7684\u306a\u30a2\u30d7\u30ed\u30fc\u30c1\u304c\u5fc5\u8981\u3067\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u6d3b\u7528\u3067\u304d\u308b\u5177\u4f53\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">N+1 \u554f\u984c\u3092\u7279\u5b9a\u3057\u3066\u89e3\u6c7a\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">N+1\u554f\u984c\u306f\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u91cd\u5927\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u308b\u4ee3\u8868\u7684\u306a\u554f\u984c\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u554f\u984c\u306e\u7279\u5b9a\u65b9\u6cd5\uff1a<\/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=\"\">\/\/ \u30c7\u30d0\u30c3\u30b0\u30d0\u30fc\u3092\u4f7f\u7528\u3057\u305f\u691c\u51fa\n\/\/ AppServiceProvider\u3067\u8a2d\u5b9a\npublic function boot()\n{\n    if (config('app.debug')) {\n        DB::listen(function($query) {\n            \/\/ \u540c\u3058\u3088\u3046\u306a\u30af\u30a8\u30ea\u304c\u7e70\u308a\u8fd4\u3057\u5b9f\u884c\u3055\u308c\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\n            if (str_contains($query-&gt;sql, 'WHERE id =')) {\n                Log::channel('sql')-&gt;warning('Potential N+1 detected:', [\n                    'sql' =&gt; $query-&gt;sql,\n                    'stack_trace' =&gt; debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)\n                ]);\n            }\n        });\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u4e00\u822c\u7684\u306a\u89e3\u6c7a\u65b9\u6cd5\uff1a<\/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=\"\">\/\/ N+1\u554f\u984c\u304c\u3042\u308b\u4f8b\n$posts = Post::all();\nforeach ($posts as $post) {\n    echo $post-&gt;author-&gt;name; \/\/ \u5404\u6295\u7a3f\u306b\u5bfe\u3057\u3066\u8ffd\u52a0\u306e\u30af\u30a8\u30ea\u304c\u767a\u751f\n}\n\n\/\/ Eager\u30ed\u30fc\u30c9ing\u306b\u3088\u308b\u89e3\u6c7a\n$posts = Post::with('author')-&gt;get();\nforeach ($posts as $post) {\n    echo $post-&gt;author-&gt;name; \/\/ \u8ffd\u52a0\u306e\u30af\u30a8\u30ea\u306f\u767a\u751f\u3057\u306a\u3044\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u4f4e\u4e0b\u306e\u539f\u56e0\u3068\u306a\u308b\u6587\u7ae0\u3092\u898b\u3064\u3051\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30b9\u30ed\u30fc\u30af\u30a8\u30ea\u306e\u691c\u51fa\u3068\u6539\u5584\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5168\u4f53\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u5411\u4e0a\u306b\u76f4\u7d50\u3057\u307e\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=\"\">\/\/ \u30b9\u30ed\u30fc\u30af\u30a8\u30ea\u691c\u51fa\u7528\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\nnamespace App\\Http\\Middleware;\n\nclass QueryPerformanceMonitor\n{\n    public function handle($request, Closure $next)\n    {\n        \/\/ \u30af\u30a8\u30ea\u306e\u5b9f\u884c\u6642\u9593\u3092\u8a08\u6e2c\n        DB::listen(function($query) {\n            if ($query-&gt;time &gt; 100) { \/\/ 100ms\u4ee5\u4e0a\u304b\u304b\u308b\u30af\u30a8\u30ea\u3092\u691c\u51fa\n                $this-&gt;logSlowQuery($query);\n            }\n        });\n\n        return $next($request);\n    }\n\n    private function logSlowQuery($query)\n    {\n        Log::channel('slow-queries')-&gt;warning('\u30b9\u30ed\u30fc\u30af\u30a8\u30ea\u3092\u691c\u51fa', [\n            'sql' =&gt; $query-&gt;sql,\n            'bindings' =&gt; $query-&gt;bindings,\n            'time' =&gt; $query-&gt;time,\n            'url' =&gt; request()-&gt;fullUrl(),\n            'user_id' =&gt; auth()-&gt;id(),\n            'trace' =&gt; collect(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 10))\n                -&gt;map(fn($trace) =&gt; $trace['file'] ?? '' . ':' . ($trace['line'] ?? ''))\n                -&gt;implode(\"\\n\")\n        ]);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u8907\u96d1\u306a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u30b7\u30c3\u30d7\u306e\u767a\u8a00\u3092\u78ba\u8a8d\u3059\u308b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u8907\u96d1\u306a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u30b7\u30c3\u30d7\u3092\u542b\u3080\u30af\u30a8\u30ea\u306f\u3001\u7279\u306b\u6ce8\u610f\u6df1\u304f\u76e3\u8996\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\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=\"\">\/\/ \u8907\u96d1\u306a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u30b7\u30c3\u30d7\u306e\u4f8b\n$result = Post::with(['author.profile', 'comments.user.profile'])\n    -&gt;whereHas('comments', function($query) {\n        $query-&gt;where('created_at', '&gt;', now()-&gt;subDays(7));\n    })\n    -&gt;get();\n\n\/\/ \u30af\u30a8\u30ea\u306e\u5206\u6790\n$eloquentQuery = Post::with(['author.profile', 'comments.user.profile']);\ndd([\n    'base_query' =&gt; $eloquentQuery-&gt;toSql(),\n    'bindings' =&gt; $eloquentQuery-&gt;getBindings(),\n    'executed_queries' =&gt; DB::getQueryLog(), \/\/ \u30ed\u30b0\u3092\u6709\u52b9\u5316\u3057\u3066\u3044\u308b\u5834\u5408\n]);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5b9a\u671f\u7684\u306a\u78ba\u8a8d\u9805\u76ee\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N+1\u554f\u984c\u306e\u6709\u7121<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n\n\n\n<li>\u4e0d\u8981\u306a\u30ab\u30e9\u30e0\u306e\u53d6\u5f97<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u306e\u5b9f\u884c\u56de\u6570<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5fc5\u8981\u306a\u30c7\u30fc\u30bf\u306e\u307f\u3092\u53d6\u5f97\u3059\u308b<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u8a2d\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b<\/li>\n\n\n\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u3092\u691c\u8a0e\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u30bf\u30a4\u30df\u30f3\u30b0\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u6a5f\u80fd\u306e\u30ea\u30ea\u30fc\u30b9\u524d<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u306a\u30c7\u30fc\u30bf\u66f4\u65b0\u6642<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u6570\u306e\u5897\u52a0\u6642<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30ec\u30d3\u30e5\u30fc\u6642<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u624b\u6cd5\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u3068\u7d99\u7d9a\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6539\u5584\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">SQL\u66f8\u304d\u8fbc\u307f\u78ba\u8a8d\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SQL\u30af\u30a8\u30ea\u306e\u78ba\u8a8d\u3068\u6700\u9069\u5316\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u54c1\u8cea\u3092\u7dad\u6301\u3059\u308b\u4e0a\u3067\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u3053\u3053\u3067\u306f\u3001\u958b\u767a\u74b0\u5883\u304b\u3089\u672c\u756a\u74b0\u5883\u307e\u3067\u3001\u69d8\u3005\u306a\u72b6\u6cc1\u3067\u6d3b\u7528\u3067\u304d\u308b\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u958b\u767a\u74b0\u5883\u3067\u306e\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u8a2d\u5b9a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u958b\u767a\u74b0\u5883\u3067\u306f\u3001\u8a73\u7d30\u306a\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u308b\u3088\u3046\u3001\u9069\u5207\u306a\u8a2d\u5b9a\u3092\u884c\u3046\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306e\u6700\u9069\u5316\uff1a<\/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=\"\">\/\/ config\/app.php\n'debug' =&gt; env('APP_DEBUG', true),\n\n\/\/ .env.development\nAPP_DEBUG=true\nDEBUGBAR_ENABLED=true\nDB_LOGGING=true<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a\uff1a<\/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=\"\">\/\/ config\/logging.php\n'channels' =&gt; [\n    'sql_debug' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/sql\/debug.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n        'permission' =&gt; 0664,\n    ],\n    'slow_queries' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/sql\/slow.log'),\n        'level' =&gt; 'warning',\n        'days' =&gt; 30,\n    ],\n];<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u958b\u767a\u7528\u306eServiceProvider\u4f5c\u6210\uff1a<\/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=\"\">namespace App\\Providers;\n\nclass SqlDebugServiceProvider extends ServiceProvider\n{\n    public function boot()\n    {\n        if (config('app.debug')) {\n            \/\/ \u30af\u30a8\u30ea\u30ed\u30b0\u306e\u8a2d\u5b9a\n            DB::listen(function($query) {\n                $sql = str_replace(['?'], $query-&gt;bindings, $query-&gt;sql);\n                $time = $query-&gt;time;\n\n                \/\/ \u5b9f\u884c\u6642\u9593\u306b\u5fdc\u3058\u3066\u30ed\u30b0\u30ec\u30d9\u30eb\u3092\u5909\u66f4\n                if ($time &gt; 1000) {\n                    Log::channel('slow_queries')-&gt;error(\"Very slow query detected!\", compact('sql', 'time'));\n                } elseif ($time &gt; 100) {\n                    Log::channel('slow_queries')-&gt;warning(\"Slow query detected\", compact('sql', 'time'));\n                } else {\n                    Log::channel('sql_debug')-&gt;info(\"Query executed\", compact('sql', 'time'));\n                }\n            });\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u672c\u756a\u74b0\u5883\u3067\u306e\u5b89\u5168\u306a\u691c\u8a3c\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u756a\u74b0\u5883\u3067\u306f\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u306a\u304c\u3089\u3001\u5fc5\u8981\u306a\u60c5\u5831\u306e\u307f\u3092\u53ce\u96c6\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u30ed\u30b0\u8a2d\u5b9a\uff1a<\/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=\"\">\/\/ config\/logging.php\n'production_sql' =&gt; [\n    'driver' =&gt; 'daily',\n    'path' =&gt; storage_path('logs\/sql\/production.log'),\n    'level' =&gt; 'warning',\n    'days' =&gt; 7,\n    'permission' =&gt; 0600,\n    'tap' =&gt; [App\\Logging\\SqlSanitizer::class],\n],<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u30c7\u30fc\u30bf\u306e\u4fdd\u8b77\uff1a<\/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=\"\">namespace App\\Logging;\n\nclass SqlSanitizer\n{\n    public function __invoke($logger)\n    {\n        foreach ($logger-&gt;getHandlers() as $handler) {\n            $handler-&gt;pushProcessor(function ($record) {\n                \/\/ \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u30c7\u30fc\u30bf\u3092\u30de\u30b9\u30af\n                $record['context'] = $this-&gt;maskSensitiveData($record['context']);\n                return $record;\n            });\n        }\n    }\n\n    private function maskSensitiveData($data)\n    {\n        $sensitiveFields = ['password', 'email', 'credit_card'];\n\n        array_walk_recursive($data, function(&amp;$value, $key) use ($sensitiveFields) {\n            if (in_array(strtolower($key), $sensitiveFields)) {\n                $value = '********';\n            }\n        });\n\n        return $data;\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u8a2d\u5b9a\uff1a<\/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=\"\">\/\/ \u672c\u756a\u74b0\u5883\u7528\u306e\u30af\u30a8\u30ea\u30e2\u30cb\u30bf\u30fc\nnamespace App\\Monitoring;\n\nclass ProductionQueryMonitor\n{\n    public function handle($query)\n    {\n        \/\/ \u5b9f\u884c\u6642\u9593\u306e\u95be\u5024\uff08\u30df\u30ea\u79d2\uff09\n        $thresholds = [\n            'error' =&gt; 1000,   \/\/ 1\u79d2\u4ee5\u4e0a\n            'warning' =&gt; 500,  \/\/ 500\u30df\u30ea\u79d2\u4ee5\u4e0a\n            'notice' =&gt; 200    \/\/ 200\u30df\u30ea\u79d2\u4ee5\u4e0a\n        ];\n\n        $context = [\n            'query' =&gt; $this-&gt;sanitizeQuery($query-&gt;sql),\n            'time' =&gt; $query-&gt;time,\n            'connection' =&gt; $query-&gt;connectionName,\n            'database' =&gt; config(\"database.connections.{$query-&gt;connectionName}.database\")\n        ];\n\n        foreach ($thresholds as $level =&gt; $threshold) {\n            if ($query-&gt;time &gt;= $threshold) {\n                Log::channel('production_sql')-&gt;$level(\n                    \"Query performance issue detected\",\n                    $context\n                );\n                break;\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u8a55\u4fa1\u30ec\u30d3\u30e5\u30fc\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30c1\u30fc\u30e0\u958b\u767a\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u30dd\u30a4\u30f3\u30c8\u306b\u6ce8\u610f\u3057\u3066SQL\u30af\u30a8\u30ea\u3092\u30ec\u30d3\u30e5\u30fc\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/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=\"\">\/\/ \u30ec\u30d3\u30e5\u30fc\u7528\u306e\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u4f8b\n\/**\n * @reviewed-query\n * @performance-checked\n * @index-verified\n * @params-sanitized\n *\/\npublic function scopeActiveUsers($query)\n{\n    return $query-&gt;where('status', 'active')\n                 -&gt;whereNotNull('email_verified_at');\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u57fa\u6e96\u306e\u8a2d\u5b9a\uff1a<\/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=\"\">\/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8\u7528\u306e\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\nnamespace Tests\\Feature;\n\nclass QueryPerformanceTest extends TestCase\n{\n    public function testComplexQueryPerformance()\n    {\n        $startTime = microtime(true);\n\n        \/\/ \u30c6\u30b9\u30c8\u5bfe\u8c61\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\n        $result = YourModel::withComplexRelations()-&gt;get();\n\n        $executionTime = microtime(true) - $startTime;\n\n        \/\/ \u5b9f\u884c\u6642\u9593\u304c\u8a31\u5bb9\u7bc4\u56f2\u5185\u304b\u30c1\u30a7\u30c3\u30af\n        $this-&gt;assertLessThan(\n            1.0, \/\/ 1\u79d2\u4ee5\u5185\n            $executionTime,\n            \"Complex query took too long: {$executionTime} seconds\"\n        );\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30c1\u30fc\u30e0\u5171\u6709\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u306e\u4f7f\u7528\u3092\u57fa\u672c\u3068\u3057\u3001Raw SQL\u306f\u5fc5\u8981\u306a\u5834\u5408\u306e\u307f\u4f7f\u7528<\/li>\n\n\n\n<li>Eager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u7a4d\u6975\u7684\u306a\u6d3b\u7528<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6226\u7565\u306e\u6587\u66f8\u5316<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u5b9a\u671f\u7684\u306a\u30ec\u30d3\u30e5\u30fc<\/li>\n\n\n\n<li>\u547d\u540d\u898f\u5247\u306e\u7d71\u4e00\uff08\u4f8b\uff1a\u30b9\u30b3\u30fc\u30d7\u3001\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\uff09<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u958b\u767a\u52b9\u7387\u306e\u5411\u4e0a\u3068\u30b3\u30fc\u30c9\u306e\u54c1\u8cea\u7dad\u6301\u3092\u4e21\u7acb\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-19\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel\u3067\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b\u304a\u3044\u3066\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u554f\u984c\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u5b9f\u8df5\u7684\u306a\u30a2\u30d7\u30ed\u30fc\u30c1\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u3067\u983b\u7e41\u306b\u906d\u9047\u3059\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u5bfe\u51e6\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u63a5\u7d9a\u30a8\u30e9\u30fc\u306e\u8a3a\u65ad\uff1a<\/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::connection()-&gt;getPdo();\n} catch (\\Exception $e) {\n    \/\/ \u63a5\u7d9a\u30a8\u30e9\u30fc\u306e\u8a73\u7d30\u306a\u30ed\u30b0\u53d6\u5f97\n    Log::error('Database connection failed', [\n        'error' =&gt; $e-&gt;getMessage(),\n        'code' =&gt; $e-&gt;getCode(),\n        'trace' =&gt; $e-&gt;getTraceAsString(),\n        'config' =&gt; [\n            'host' =&gt; config('database.connections.mysql.host'),\n            'database' =&gt; config('database.connections.mysql.database'),\n            'username' =&gt; config('database.connections.mysql.username'),\n            \/\/ \u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u8a18\u9332\u3057\u306a\u3044\n        ]\n    ]);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u306e\u691c\u51fa\u3068\u89e3\u6c7a\uff1a<\/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::transaction(function () {\n        \/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u51e6\u7406\n    }, 5); \/\/ \u6700\u59275\u56de\u30ea\u30c8\u30e9\u30a4\n} catch (\\Illuminate\\Database\\QueryException $e) {\n    if ($e-&gt;errorInfo[1] === 1213) { \/\/ \u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u30a8\u30e9\u30fc\u30b3\u30fc\u30c9\n        Log::warning('Deadlock detected', [\n            'error' =&gt; $e-&gt;getMessage(),\n            'sql' =&gt; $e-&gt;getSql(),\n            'bindings' =&gt; $e-&gt;getBindings()\n        ]);\n\n        \/\/ \u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u6642\u306e\u4ee3\u66ff\u51e6\u7406\n        $this-&gt;handleDeadlock();\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u5bfe\u7b56\uff1a<\/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=\"\">\/\/ config\/database.php\n'mysql' =&gt; [\n    'options' =&gt; [\n        PDO::ATTR_TIMEOUT =&gt; 60, \/\/ 60\u79d2\n    ],\n    'sticky'    =&gt; true,\n    'retry_after' =&gt; 60,\n    'retry_count' =&gt; 3,\n],<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u6587\u7ae0\u5206\u6790<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f7f\u7528\u72b6\u6cc1\u306e\u5206\u6790\uff1a<\/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=\"\">\/\/ \u30af\u30a8\u30ea\u30d7\u30e9\u30f3\u306e\u53d6\u5f97\nDB::select('EXPLAIN SELECT * FROM users WHERE email = ?', ['example@example.com']);\n\n\/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f7f\u7528\u72b6\u6cc1\u306e\u30ed\u30b0\nDB::listen(function($query) {\n    $explainResults = DB::select(\"EXPLAIN {$query-&gt;sql}\", $query-&gt;bindings);\n\n    foreach ($explainResults as $result) {\n        if ($result-&gt;type === 'ALL') { \/\/ \u30d5\u30eb\u30c6\u30fc\u30d6\u30eb\u30b9\u30ad\u30e3\u30f3\u306e\u691c\u51fa\n            Log::warning('Full table scan detected', [\n                'table' =&gt; $result-&gt;table,\n                'possible_keys' =&gt; $result-&gt;possible_keys,\n                'sql' =&gt; $query-&gt;sql\n            ]);\n        }\n    }\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\uff1a<\/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=\"\">\/\/ \u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u30c1\u30e3\u30f3\u30af\u51e6\u7406\nUser::chunk(1000, function ($users) {\n    foreach ($users as $user) {\n        \/\/ \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u51e6\u7406\n    }\n});\n\n\/\/ \u30ab\u30fc\u30bd\u30eb\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u53d6\u5f97\nforeach (User::cursor() as $user) {\n    \/\/ 1\u30ec\u30b3\u30fc\u30c9\u305a\u3064\u51e6\u7406\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u306e\u767a\u898b\u3068\u5bfe\u7b56<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56\uff1a<\/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=\"\">\/\/ \u5b89\u5168\u306a\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u306e\u4f7f\u7528\n$users = DB::table('users')\n    -&gt;where('status', request('status'))\n    -&gt;get();\n\n\/\/ \u5371\u967a\u306aRaw SQL\u306e\u691c\u51fa\nDB::listen(function($query) {\n    if (preg_match('\/UNION|INSERT|UPDATE|DELETE|DROP|ALTER\/i', $query-&gt;sql)) {\n        Log::alert('Potentially dangerous SQL detected', [\n            'sql' =&gt; $query-&gt;sql,\n            'source' =&gt; debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)\n        ]);\n    }\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u5b9f\u88c5\uff1a<\/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=\"\">\/\/ \u30e2\u30c7\u30eb\u30dd\u30ea\u30b7\u30fc\u3067\u306e\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\nclass UserPolicy\n{\n    public function update(User $user, User $targetUser)\n    {\n        return $user-&gt;id === $targetUser-&gt;id || $user-&gt;isAdmin();\n    }\n}\n\n\/\/ \u30af\u30a8\u30ea\u30b9\u30b3\u30fc\u30d7\u3067\u306e\u5236\u9650\nclass User extends Model\n{\n    protected static function booted()\n    {\n        static::addGlobalScope('active', function ($query) {\n            $query-&gt;where('status', 'active');\n        });\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u306e\u5b9f\u88c5\uff1a<\/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=\"\">\/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306e\u76e3\u67fb\u30ed\u30b0\nclass DatabaseAudit\n{\n    public static function log($action, $model, $changes = [])\n    {\n        AuditLog::create([\n            'user_id' =&gt; auth()-&gt;id(),\n            'action' =&gt; $action,\n            'model' =&gt; get_class($model),\n            'model_id' =&gt; $model-&gt;id,\n            'changes' =&gt; json_encode($changes),\n            'ip_address' =&gt; request()-&gt;ip(),\n            'user_agent' =&gt; request()-&gt;userAgent()\n        ]);\n    }\n}\n\n\/\/ \u30e2\u30c7\u30eb\u3067\u306e\u4f7f\u7528\nprotected static function booted()\n{\n    static::updated(function ($model) {\n        DatabaseAudit::log('update', $model, $model-&gt;getDirty());\n    });\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u624b\u6cd5\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u307e\u305f\u3001\u5b9a\u671f\u7684\u306a\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u3068\u76e3\u67fb\u3092\u901a\u3058\u3066\u3001\u6f5c\u5728\u7684\u306a\u554f\u984c\u3092\u65e9\u671f\u306b\u767a\u898b\u3057\u3001\u5bfe\u51e6\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\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":["post-3208","post","type-post","status-publish","format-standard","category-php-laravel","category-php","nothumb"],"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3208","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=3208"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3208\/revisions"}],"predecessor-version":[{"id":3210,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3208\/revisions\/3210"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}