{"id":1011,"date":"2025-06-12T04:49:34","date_gmt":"2025-06-11T20:49:34","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/laravel\/1011.html"},"modified":"2025-06-12T04:49:34","modified_gmt":"2025-06-11T20:49:34","slug":"%e5%9c%a8-laravel-eloquent-%e4%b8%ad%e4%bd%bf%e7%94%a8left-join","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1011.html","title":{"rendered":"\u5728 Laravel Eloquent \u4e2d\u4f7f\u7528\u2018LEFT JOIN\u2019"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312; Laravel Eloquent &#20013;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992; <code>leftJoin<\/code> &#26041;&#27861;&#26469;&#23454;&#29616;&#24038;&#36830;&#25509;&#65288;Left Join&#65289;&#12290;&#36825;&#19982; SQL &#20013;&#30340; <code>LEFT JOIN<\/code> &#35821;&#27861;&#30456;&#21516;&#12290;&#20197;&#19979;&#26159;&#19968;&#20010;&#31034;&#20363;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312; Laravel Eloquent &#20013;&#36827;&#34892;&#24038;&#36830;&#25509;&#65306;<\/p>\n<p>&#20551;&#35774;&#25105;&#20204;&#26377;&#20004;&#20010;&#27169;&#22411;&#65306;<code>User<\/code> &#21644; <code>Post<\/code>&#65292;&#24182;&#19988;&#23427;&#20204;&#20043;&#38388;&#36890;&#36807; <code>userId<\/code> &#36827;&#34892;&#20851;&#32852;&#12290;<\/p>\n<h3>1. &#23450;&#20041;&#27169;&#22411;<\/h3>\n<p>&#39318;&#20808;&#65292;&#23450;&#20041;&#20320;&#30340;&#27169;&#22411;&#31867;&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppModels;\n\nuse IlluminateDatabaseEloquentModel;\n\nclass User extends Model\n{\n    public function posts()\n    {\n        return $this-&gt;hasMany(Post::class, 'userId');\n    }\n}<\/code><\/pre>\n<h3>2. &#20351;&#29992; <code>leftJoin<\/code> &#36827;&#34892;&#24038;&#36830;&#25509;<\/h3>\n<p>&#25509;&#19979;&#26469;&#65292;&#20320;&#22312;&#25511;&#21046;&#22120;&#25110;&#20854;&#20182;&#22320;&#26041;&#20351;&#29992; <code>leftJoin<\/code> &#36827;&#34892;&#24038;&#36830;&#25509;&#65306;<\/p>\n<pre><code class=\"language-php\">use AppModelsUser;\nuse AppModelsPost;\n\npublic function index()\n{\n    $users = User::with('posts')-&gt;get();\n\n    foreach ($users as $user) {\n        echo \"User: {$user-&gt;name}n\";\n        if ($user-&gt;posts-&gt;isEmpty()) {\n            echo \"No posts for this user.n\";\n        } else {\n            foreach ($user-&gt;posts as $post) {\n                echo \"- Post: {$post-&gt;title}n\";\n            }\n        }\n    }\n\n    return view('users.index', ['users' =&gt; $users]);\n}<\/code><\/pre>\n<h3>3. &#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#22914;&#26524;&#20320;&#38656;&#35201;&#26356;&#35814;&#32454;&#30340;&#31034;&#20363;&#20195;&#30721;&#65292;&#21487;&#20197;&#21442;&#32771;&#20197;&#19979;&#23436;&#25972;&#31034;&#20363;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppHttpControllers;\n\nuse AppModelsUser;\nuse AppModelsPost;\n\nclass UserController extends Controller\n{\n    public function index()\n    {\n        \/\/ &#20351;&#29992; with &#20851;&#38190;&#23383;&#36827;&#34892; eager loading\n        $users = User::with('posts')-&gt;get();\n\n        foreach ($users as $user) {\n            echo \"User: {$user-&gt;name}n\";\n            if ($user-&gt;posts-&gt;isEmpty()) {\n                echo \"No posts for this user.n\";\n            } else {\n                foreach ($user-&gt;posts as $post) {\n                    echo \"- Post: {$post-&gt;title}n\";\n                }\n            }\n        }\n\n        return view('users.index', ['users' =&gt; $users]);\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#31034;&#20363;&#20013;&#65292;&#25105;&#20204;&#20351;&#29992;&#20102; <code>with<\/code> &#26041;&#27861;&#26469;&#21152;&#36733;&#20851;&#32852;&#30340; <code>Post<\/code> &#27169;&#22411;&#65292;&#24182;&#22312;&#35270;&#22270;&#20013;&#26174;&#31034;&#27599;&#20010;&#29992;&#25143;&#30340;&#24086;&#23376;&#21015;&#34920;&#12290;&#22914;&#26524;&#29992;&#25143;&#27809;&#26377;&#24086;&#23376;&#65292;&#21017;&#20250;&#26174;&#31034;&ldquo;No posts for this user.&rdquo;&#30340;&#28040;&#24687;&#12290;<\/p>\n<p>&#24076;&#26395;&#36825;&#20010;&#31034;&#20363;&#33021;&#24110;&#21161;&#20320;&#29702;&#35299;&#22312; Laravel Eloquent &#20013;&#20351;&#29992; <code>leftJoin<\/code> &#30340;&#26041;&#27861;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#20171;&#32461;<\/h2><p>Laravel&#65292;&#22791;&#21463;&#36190;&#35465;&#30340;PHP&#26694;&#26550;&#65292;&#20026;web&#24320;&#21457;&#32773;&#25552;&#20379;&#20102;&#19968;&#20010;&#20248;&#38597;&#30340;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65288;ORM&#65289;&#24037;&#20855;&mdash;&mdash;Eloquent&#12290;&#20854;&#21151;&#33021;&#20043;&#19968;&#20415;&#26159;&#36890;&#36807;&#31616;&#27905;&#30340;PHP&#35821;&#27861;&#26500;&#24314;&#39640;&#25928;&#30340;&#25968;&#25454;&#24211;&#26597;&#35810;&#12290;&#22312;&#26412;&#25945;&#31243;&#20013;&#65292;&#24744;&#23558;&#23398;&#20064;&#22914;&#20309;&#21033;&#29992;Laravel Eloquent&#20013;&#30340;&ldquo;LEFT JOIN&rdquo;SQL&#23376;&#21477;&#65292;&#24182;&#20197;&#22810;&#31181;&#31034;&#20363;&#36827;&#34892;&#23637;&#31034;&#65292;&#20174;&#22522;&#30784;&#21040;&#22797;&#26434;&#22330;&#26223;&#37117;&#26377;&#28085;&#30422;&#12290;<\/p><h3>&#29702;&#35299;&ldquo;&#24038;&#36830;&#25509;&rdquo;&#65288;LEFT JOIN&#65289;<\/h3><p>&#22312;&#28145;&#20837;&#25506;&#35752;Eloquent&#30340;&#25277;&#35937;&#20043;&#21069;&#65292;&#35753;&#25105;&#20204;&#20808;&#28548;&#28165;&#19968;&#19979;&ldquo;&#24038;&#36830;&#25509;&rdquo;&#65288;LEFT JOIN&#65289;&#30340;&#20316;&#29992;&#12290;SQL&#20013;&#30340;&ldquo;LEFT JOIN&rdquo;&#29992;&#20110;&#23558;&#20004;&#20010;&#25110;&#22810;&#20010;&#34920;&#30340;&#34892;&#21512;&#24182;&#65292;&#22522;&#20110;&#23427;&#20204;&#20043;&#38388;&#30340;&#30456;&#20851;&#21015;&#65292;&#36820;&#22238;&#24038;&#34920;&#30340;&#25152;&#26377;&#35760;&#24405;&#21644;&#21491;&#34920;&#21305;&#37197;&#30340;&#35760;&#24405;&#65292;&#22914;&#26524;&#25214;&#19981;&#21040;&#21305;&#37197;&#39033;&#65292;&#21017;&#29992;NULL&#22635;&#20805;&#12290;<\/p><h3>&#35774;&#32622;&#25105;&#20204;&#30340;&#29615;&#22659;<\/h3><p>&#20026;&#20102;&#36319;&#38543;&#36825;&#20123;&#31034;&#20363;&#65292;&#30830;&#20445;&#24744;&#24050;&#32463;&#35774;&#32622;&#20102;&#19968;&#20010;Laravel&#39033;&#30446;&#12290;&#24744;&#24212;&#35813;&#22312;.env&#25991;&#20214;&#20013;&#37197;&#32622;&#25968;&#25454;&#24211;&#65292;&#24182;&#19988;&#24050;&#36816;&#34892;&#24744;&#24076;&#26395;&#36830;&#25509;&#30340;&#34920;&#30340;&#36801;&#31227;&#12290;<\/p><h2>&#22522;&#26412;&#30340;LEFT JOIN&#22312;Eloquent&#20013;&#30340;&#23454;&#29616;&#26041;&#24335;&#12290;<\/h2><p>&#20351;&#29992;Eloquent&#20013;&#30340;&#36830;&#25509;&#26041;&#27861;&#65288;joins&#65289;&#30340;&#36215;&#28857;&#26159;join&#26041;&#27861;&#65292;&#21487;&#20197;&#36866;&#37197;&#20026;&#36827;&#34892;&ldquo;&#24038;&#36830;&#25509;&rdquo;&#25805;&#20316;&#12290;&#35753;&#25105;&#20204;&#20174;&#19968;&#20010;&#31616;&#21333;&#30340;&#22330;&#26223;&#24320;&#22987;&#65292;&#35813;&#22330;&#26223;&#28041;&#21450;&#29992;&#25143;&#21644;&#24086;&#23376;&#34920;&#65292;&#24182;&#19988;&#20320;&#24819;&#33719;&#21462;&#25152;&#26377;&#29992;&#25143;&#21450;&#20854;&#24086;&#23376;&#65292;&#22914;&#26524;&#26377;&#30340;&#35805;&#12290;\n\n&#39318;&#20808;&#65292;&#30830;&#20445;&#24050;&#23433;&#35013;&#20102;Laravel&#26694;&#26550;&#24182;&#21019;&#24314;&#20102;&#19968;&#20010;&#26032;&#39033;&#30446;&#12290;\n\n&#36827;&#20837;&#39033;&#30446;&#30446;&#24405;&#65292;&#36816;&#34892;&#20197;&#19979;&#21629;&#20196;&#21021;&#22987;&#21270;&#25968;&#25454;&#24211;&#65306;\nphp artisan migrate &#8211;seed\n\n&#21019;&#24314;&#20004;&#20010;&#27169;&#22411;&#65306;User &#21644; Post&#12290;\n\n&#22312; app\/Models\/User.php &#20013;&#23450;&#20041; User &#27169;&#22411;&#65306;\n&lt;?php\n\nnamespace AppModels;\n\nuse IlluminateDatabaseEloquentFactoriesHasFactory;\nuse IlluminateFoundationAuthUser as Authenticatable;\nuse IlluminateNotificationsNotifiable;\n\nclass User extends Authenticatable\n{\n use HasFactory, Notifiable;\n\n \/**\n * The attributes that are mass assignable.\n *\n * @var array&lt;int, string&gt;\n *\/\n protected $fillable = [\n &#8216;name&#8217;, &#8217;email&#8217;, &#8216;password&#8217;,\n ];\n\n \/**\n * The attributes that should be hidden for serialization.\n *\n * @var array&lt;int, string&gt;\n *\/\n protected $hidden = [\n &#8216;password&#8217;, &#8216;remember_token&#8217;,\n ];\n}\n\n&#22312; app\/Models\/Post.php &#20013;&#23450;&#20041; Post &#27169;&#22411;&#65306;\n&lt;?php\n\nnamespace AppModels;\n\nuse IlluminateDatabaseEloquentFactoriesHasFactory;\nuse IlluminateFoundationAuthUser as Authenticatable;\nuse IlluminateNotificationsNotifiable;\n\nclass Post extends Authenticatable\n{\n use HasFactory, Notifiable;\n\n \/**\n * The attributes that are mass assignable.\n *\n * @var array&lt;int, string&gt;\n *\/\n protected $fillable = [\n &#8216;title&#8217;, &#8216;content&#8217;, &#8216;author_id&#8217;,\n ];\n\n \/**\n * The attributes that should be hidden for serialization.\n *\n * @var array&lt;int, string&gt;\n *\/\n protected $hidden = [];\n}\n\n&#23450;&#20041;&#20851;&#32852;&#20851;&#31995;&#65306;\n&lt;?php\n\nnamespace AppModels;\n\nuse IlluminateDatabaseEloquentModel;\n\nclass User extends Authenticatable\n{\n public function posts()\n {\n return $this-&gt;hasMany(Post::class);\n }\n\n \/\/ &#33719;&#21462;&#29305;&#23450;&#29992;&#25143;&#30340;&#24086;&#23376;\n public function getPostsAttribute()\n {\n return collect($this-&gt;posts)-&gt;map(function ($post) {\n return [\n &#8216;id&#8217; =&gt; $post-&gt;id,\n &#8216;title&#8217; =&gt; $post-&gt;title,\n &#8216;content&#8217; =&gt; $post-&gt;content,\n &#8216;created_at&#8217; =&gt; $post-&gt;created_at,\n ];\n });\n }\n}\n\n&#22312;&#25511;&#21046;&#22120;&#20013;&#20351;&#29992; with &#26041;&#27861;&#26469;&#21152;&#36733;&#20851;&#32852;&#25968;&#25454;&#65306;\n&lt;?php\n\nnamespace AppHttpControllers;\n\nuse AppModelsUser;\nuse AppModelsPost;\nuse IlluminateHttpRequest;\n\nclass UserController extends Controller\n{\n public function index(Request $request)\n {\n $users = User::with(&#8216;posts&#8217;)-&gt;get();\n\n return response()-&gt;json([\n &#8216;success&#8217; =&gt; true,\n &#8216;data&#8217; =&gt; $users-&gt;toArray(),\n ]);\n }\n}\n\n&#20351;&#29992;&#36335;&#30001;&#35775;&#38382; API&#65306;\n&lt;?php\n\nuse IlluminateSupportFacadesRoute;\n\nRoute::resource(&#8216;users&#8217;, UserController::class);\n\n&#27979;&#35797; API &#35843;&#29992;&#65306;\n&#20351;&#29992;&#24037;&#20855;&#22914; Postman &#25110; curl &#26469;&#27979;&#35797; GET \/api\/users &#31471;&#28857;&#12290;\n\n&#29616;&#22312;&#65292;&#20320;&#21487;&#20197;&#36890;&#36807; GET \/api\/users &#25509;&#21475;&#33719;&#21462;&#25152;&#26377;&#29992;&#25143;&#30340;&#24086;&#23376;&#20449;&#24687;&#12290;&#22914;&#26524;&#26377;&#22810;&#20010;&#24086;&#23376;&#65292;&#23427;&#20204;&#20250;&#20197;&#25968;&#32452;&#30340;&#24418;&#24335;&#36820;&#22238;&#12290;&#27599;&#20010;&#24086;&#23376;&#21253;&#21547; ID&#12289;&#26631;&#39064;&#12289;&#20869;&#23481;&#21644;&#21457;&#24067;&#26102;&#38388;&#12290;<\/p><pre><code>\/\/ Using the query builder\n$users = DB::table('users')\n   -&gt;leftJoin('posts', 'users.id', '=', 'posts.user_id')\n   -&gt;get();\n\/\/ Using Eloquent's relationship\n$users = User::with('posts')-&gt;get();<\/code><\/pre><h2>&#20351;&#29992;&#24102;&#31579;&#36873;&#26465;&#20214;&#30340;&#24038;&#36830;&#25509;&#65288;LEFT JOIN&#65289;<\/h2><p>&#23454;&#38469;&#19978;&#65292;&#20320;&#21487;&#33021;&#19981;&#38656;&#35201;&#20174;&#20004;&#20010;&#34920;&#20013;&#36873;&#25321;&#25152;&#26377;&#21015;&#12290;&#20197;&#19979;&#26159;&#20351;&#29992;Eloquent&#20013;&#30340;&ldquo;LEFT JOIN&rdquo;&#26469;&#36873;&#25321;&#29305;&#23450;&#21015;&#30340;&#26041;&#27861;&#12290;<\/p><pre><code>$users = DB::table('users')\n   -&gt;leftJoin('posts', 'users.id', '=', 'posts.user_id')\n   -&gt;select('users.name', 'posts.title')\n   -&gt;get();<\/code><\/pre><h2>&#39640;&#32423;&#30340;&ldquo;&#24038;&#36830;&#25509;&rdquo;&#19982;&#26465;&#20214;&#23376;&#21477;<\/h2><p>&#35753;&#25105;&#20204;&#22686;&#21152;&#19968;&#20123;&#26465;&#20214;&#35821;&#21477;&#65292;&#20197;&#20415;&#31579;&#36873;&#20986;&#25105;&#20204;&#24819;&#35201;&#30340;&#32467;&#26524;&#12290;<\/p><pre><code>$users = User::leftJoin('posts', function($join) {\n   $join-&gt;on('users.id', '=', 'posts.user_id')\n   -&gt;where('posts.created_at', '&gt;', now()-&gt;subDays(7));\n})\n-&gt;get();<\/code><\/pre><h2>&#8220;LEFT JOIN&#8221; &#19982;&#32858;&#21512;&#20989;&#25968;<\/h2><p>&#24819;&#35937;&#19968;&#19979;&#65292;&#24819;&#35201;&#25289;&#21462;&#25152;&#26377;&#29992;&#25143;&#20449;&#24687;&#65292;&#24182;&#30693;&#36947;&#27599;&#20010;&#29992;&#25143;&#30340;&#24086;&#23376;&#25968;&#37327;&#12290;&#36825;&#38656;&#35201;&#19968;&#20010;&#32858;&#21512;&#20989;&#25968;&#65292;&#21487;&#20197;&#20351;&#29992;Eloquent&#26469;&#23454;&#29616;&#12290;<\/p><pre><code>$users = User::leftJoin('posts', 'users.id', '=', 'posts.user_id')\n   -&gt;select('users.*', DB::raw('COUNT(posts.id) as posts_count'))\n   -&gt;groupBy('users.id')\n   -&gt;get();<\/code><\/pre><h2>&#22810;&#32423;&ldquo;&#24038;&#36830;&#25509;&rdquo;&#25805;&#20316;<\/h2><p>&#22312;&#22788;&#29702;&#22797;&#26434;&#30340;&#25968;&#25454;&#24211;&#27169;&#24335;&#26102;&#65292;&#20026;&#20102;&#33719;&#21462;&#36328;&#36234;&#22810;&#20010;&#34920;&#30340;&#30456;&#20851;&#25968;&#25454;&#65292;&#21487;&#33021;&#38656;&#35201;&#25191;&#34892;&#22810;&#27493;&#30340;&ldquo;&#24038;&#36830;&#25509;&rdquo;&#25805;&#20316;&#65288;LEFT JOIN&#65289;&#12290;<\/p><pre><code>$users = User::leftJoin('posts', 'users.id', '=', 'posts.user_id')\n   -&gt;leftJoin('comments', 'posts.id', '=', 'comments.post_id')\n   -&gt;select('users.name', 'posts.title', DB::raw('COUNT(comments.id) as comments_count'))\n   -&gt;groupBy('users.id', 'posts.id')\n   -&gt;get();<\/code><\/pre><h2>&#32467;&#35770;&#12290;<\/h2><p>&#22312;&#20851;&#20110;&#20351;&#29992; LEFT JOIN &#30340; Laravel Eloquent &#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#24050;&#32463;&#28085;&#30422;&#20102;&#22914;&#20309;&#25191;&#34892;&#22522;&#26412;&#36830;&#25509;&#12289;&#36873;&#25321;&#29305;&#23450;&#21015;&#12289;&#28155;&#21152;&#26465;&#20214;&#35821;&#21477;&#12289;&#21253;&#25324;&#32858;&#21512;&#20989;&#25968;&#20197;&#21450;&#25191;&#34892;&#22810;&#32423;&#36830;&#25509;&#12290;Eloquent &#25552;&#20379;&#30340;&#28789;&#27963;&#24615;&#20801;&#35768;&#24744;&#26500;&#24314;&#22797;&#26434;&#30340;&#26597;&#35810;&#65292;&#21516;&#26102;&#20445;&#25345;&#24744;&#30340; Laravel &#24212;&#29992;&#31243;&#24207;&#20013;&#30340;&#31616;&#27905;&#24615;&#21644;&#20248;&#38597;&#24615;&#12290;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312;Laravel&#26694;&#26550;&#30340;Eloquent ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65289;&#20013;&#65292;<code>LEFT JOIN<\/code> &#26159;&#19968;&#31181;&#36830;&#25509;&#25805;&#20316;&#65292;&#29992;&#20110;&#36820;&#22238;&#20004;&#20010;&#34920;&#20013;&#30340;&#25152;&#26377;&#34892;&#65292;&#20294;&#19981;&#21253;&#25324;&#37027;&#20123;&#22312;&#31532;&#19968;&#20010;&#34920;&#20013;&#27809;&#26377;&#23545;&#24212;&#35760;&#24405;&#30340;&#34892;&#12290;<\/p>\n<p>&#20197;&#19979;&#26159;&#22914;&#20309;&#22312;Laravel Eloquent&#27169;&#22411;&#20013;&#20351;&#29992;<code>LEFT JOIN<\/code>&#30340;&#31034;&#20363;&#65306;<\/p>\n<pre><code class=\"language-php\">use AppModelsUser;\nuse IlluminateDatabaseEloquentRelationsHasMany;\n\nclass User extends Model\n{\n    public function posts()\n    {\n        return $this-&gt;hasMany('AppModelsPost');\n    }\n\n    \/\/ &#20351;&#29992; LEFT JOIN\n    public function getPostsCountAttribute()\n    {\n        return $this-&gt;posts()-&gt;count();\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#23450;&#20041;&#20102;&#19968;&#20010;<code>User<\/code>&#27169;&#22411;&#65292;&#23427;&#26377;&#19968;&#20010;<code>posts<\/code>&#20851;&#32852;&#21040;<code>Post<\/code>&#27169;&#22411;&#12290;&#28982;&#21518;&#25105;&#20204;&#22312;<code>User<\/code>&#27169;&#22411;&#30340;<code>getPostsCountAttribute<\/code>&#26041;&#27861;&#20013;&#23454;&#29616;&#20102;<code>hasMany<\/code>&#26041;&#27861;&#65292;&#24182;&#20351;&#29992;&#20102;<code>LEFT JOIN<\/code>&#26469;&#33719;&#21462;&#29992;&#25143;&#30340;&#25152;&#26377;&#24086;&#23376;&#25968;&#37327;&#12290;<\/p>\n<p>&#36825;&#23558;&#36820;&#22238;&#29992;&#25143;&#30340;&#24086;&#23376;&#24635;&#25968;&#65292;&#21363;&#20351;&#35813;&#29992;&#25143;&#27809;&#26377;&#20219;&#20309;&#24086;&#23376;&#12290;&#36825;&#26679;&#21487;&#20197;&#35753;&#25105;&#20204;&#20102;&#35299;&#29992;&#25143;&#26159;&#21542;&#26377;&#20219;&#20309;&#26410;&#21457;&#24067;&#30340;&#24086;&#23376;&#12290;<\/p>\n<p>&#35831;&#27880;&#24847;&#65292;&#36825;&#20010;&#20363;&#23376;&#20551;&#35774;&#20320;&#30340;<code>User<\/code>&#27169;&#22411;&#26377;<code>posts<\/code>&#20851;&#32852;&#65292;&#24182;&#19988;&#24050;&#32463;&#35774;&#32622;&#20102;&#27491;&#30830;&#30340;&#26597;&#35810;&#26500;&#36896;&#22120;&#12290;&#22914;&#26524;&#20320;&#38656;&#35201;&#26356;&#35814;&#32454;&#30340;&#35299;&#37322;&#65292;&#35831;&#21578;&#35785;&#25105;&#65281;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#22312; Laravel Eloquent &#20013;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992; leftJoin &#26041;&#27861;&#26469;&#23454;&#29616;..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[44],"tuisongtax":[],"class_list":["post-1011","my1js","type-my1js","status-publish","hentry","my1js2nav-laravel"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/1011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=1011"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1011"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1011"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}