{"id":1136,"date":"2025-06-12T13:55:59","date_gmt":"2025-06-12T05:55:59","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1136.html"},"modified":"2025-06-12T13:55:59","modified_gmt":"2025-06-12T05:55:59","slug":"doctrine-group-by%ef%bc%9a%e5%ae%9e%e7%94%a8%e6%8c%87%e5%8d%97","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1136.html","title":{"rendered":"Doctrine GROUP BY\uff1a\u5b9e\u7528\u6307\u5357"},"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>&#12298; Doctrine GROUP BY&#65306;&#23454;&#29992;&#25351;&#21335;&#12299;<\/p>\n<p>&#22312;&#25968;&#25454;&#24211;&#24320;&#21457;&#20013;&#65292;GROUP BY &#26159;&#19968;&#20010;&#38750;&#24120;&#24378;&#22823;&#30340;&#21151;&#33021;&#65292;&#23427;&#20801;&#35768;&#25105;&#20204;&#26681;&#25454;&#26576;&#19968;&#21015;&#65288;&#25110;&#22810;&#20010;&#21015;&#65289;&#23545;&#25968;&#25454;&#36827;&#34892;&#20998;&#32452;&#65292;&#24182;&#23545;&#27599;&#20010;&#32452;&#20869;&#30340;&#35760;&#24405;&#36827;&#34892;&#32858;&#21512;&#25805;&#20316;&#12290;&#36825;&#22312;&#22788;&#29702;&#32479;&#35745;&#20449;&#24687;&#12289;&#20998;&#26512;&#25253;&#21578;&#31561;&#26041;&#38754;&#38750;&#24120;&#26377;&#29992;&#12290;<\/p>\n<h3>1. &#22522;&#26412;&#27010;&#24565;<\/h3>\n<ul>\n<li><strong>GROUP BY &#23376;&#21477;<\/strong>&#65306;&#29992;&#20110;&#23558;&#26597;&#35810;&#32467;&#26524;&#25353;&#29031;&#25351;&#23450;&#30340;&#21015;&#36827;&#34892;&#20998;&#32452;&#12290;<\/li>\n<li><strong>&#32858;&#21512;&#20989;&#25968;<\/strong>&#65306;&#22914; COUNT&#12289;SUM&#12289;AVG &#31561;&#65292;&#29992;&#20110;&#23545;&#20998;&#32452;&#21518;&#30340;&#25968;&#25454;&#36827;&#34892;&#35745;&#31639;&#12290;<\/li>\n<\/ul>\n<h3>2. &#31034;&#20363;<\/h3>\n<p>&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026; <code>employees<\/code> &#30340;&#34920;&#65292;&#20854;&#20013;&#21253;&#21547;&#20197;&#19979;&#23383;&#27573;&#65306;<\/p>\n<ul>\n<li><code>id<\/code> (&#21592;&#24037;ID)<\/li>\n<li><code>name<\/code> (&#22995;&#21517;)<\/li>\n<li><code>department<\/code> (&#37096;&#38376;)<\/li>\n<li><code>salary<\/code> (&#34218;&#27700;)<\/li>\n<\/ul>\n<h4>&#31034;&#20363; 1&#65306;&#25353;&#37096;&#38376;&#20998;&#32452;&#24182;&#35745;&#31639;&#24179;&#22343;&#24037;&#36164;<\/h4>\n<pre><code class=\"language-php\">use DoctrineORMEntityManagerInterface;\nuse DoctrineORMQueryBuilder;\n\n\/\/ &#33719;&#21462;EntityManager&#23454;&#20363;\n$entityManager = $this-&gt;getDoctrine()-&gt;getManager();\n\n\/\/ &#21019;&#24314;QueryBuilder&#23454;&#20363;\n$queryBuilder = $entityManager-&gt;createQueryBuilder();\n\n\/\/ &#23450;&#20041;&#26597;&#35810;\n$queryBuilder\n    -&gt;select('e.department, AVG(e.salary) AS average_salary')\n    -&gt;from('AppEntityEmployee', 'e')\n    -&gt;groupBy('e.department');\n\n\/\/ &#25191;&#34892;&#26597;&#35810;\n$result = $queryBuilder-&gt;getQuery()-&gt;getResult();\n\nforeach ($result as $row) {\n    echo \"Department: {$row['department']}, Average Salary: {$row['average_salary']}n\";\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#20351;&#29992;&#20102; <code>AVG<\/code> &#32858;&#21512;&#20989;&#25968;&#26469;&#35745;&#31639;&#27599;&#20010;&#37096;&#38376;&#30340;&#24179;&#22343;&#24037;&#36164;&#12290;<\/p>\n<h4>&#31034;&#20363; 2&#65306;&#25353;&#37096;&#38376;&#21644;&#24180;&#20221;&#20998;&#32452;&#24182;&#35745;&#31639;&#24635;&#34218;&#36164;<\/h4>\n<pre><code class=\"language-php\">$queryBuilder\n    -&gt;select('e.department, YEAR(e.hire_date) AS year, SUM(e.salary) AS total_salary')\n    -&gt;from('AppEntityEmployee', 'e')\n    -&gt;groupBy('e.department', 'YEAR(e.hire_date)')\n    -&gt;having('total_salary &gt; 50000');<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#20351;&#29992;&#20102; <code>HAVING<\/code> &#23376;&#21477;&#26469;&#36807;&#28388;&#20986;&#24635;&#34218;&#36164;&#36229;&#36807; 50000 &#30340;&#37096;&#38376;&#12290;<\/p>\n<h3>3. &#27880;&#24847;&#20107;&#39033;<\/h3>\n<ul>\n<li><strong>&#21807;&#19968;&#24615;<\/strong>&#65306;&#30830;&#20445;&#22312;&#20998;&#32452;&#26102;&#20351;&#29992;&#30340;&#21015;&#26159;&#21807;&#19968;&#30340;&#65292;&#21542;&#21017;&#20250;&#23548;&#33268;&#20998;&#32452;&#22833;&#36133;&#12290;<\/li>\n<li><strong>&#24615;&#33021;&#32771;&#34385;<\/strong>&#65306;&#23545;&#20110;&#22823;&#37327;&#25968;&#25454;&#65292;GROUP BY &#21487;&#33021;&#20250;&#24102;&#26469;&#19968;&#23450;&#30340;&#24615;&#33021;&#24320;&#38144;&#65292;&#22240;&#27492;&#38656;&#35201;&#35880;&#24910;&#20351;&#29992;&#12290;<\/li>\n<\/ul>\n<h3>4. &#31034;&#20363;&#20195;&#30721;&#30456;&#20851;&#27493;&#39588;<\/h3>\n<ol>\n<li>\n<p><strong>&#23433;&#35013; Doctrine ORM<\/strong>&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require doctrine\/orm<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#37197;&#32622; Entity Manager<\/strong>&#65306;\n&#22312; <code>config\/packages\/doctrine.yaml<\/code> &#20013;&#37197;&#32622; EntityManager&#12290;<\/p>\n<\/li>\n<li>\n<p><strong>&#32534;&#20889;&#23454;&#20307;&#31867;<\/strong>&#65306;\n&#21019;&#24314;&#30456;&#24212;&#30340;&#23454;&#20307;&#31867;&#65292;&#20363;&#22914; <code>Employee.php<\/code>&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppEntity;\n\nuse DoctrineORMMapping as ORM;\n\n\/**\n* @ORMEntity(repositoryClass=\"AppRepositoryEmployeeRepository\")\n*\/\nclass Employee\n{\n   \/**\n    * @ORMId\n    * @ORMGeneratedValue(strategy=\"AUTO\")\n    * @ORMColumn(type=\"integer\")\n    *\/\n   private $id;\n\n   \/**\n    * @ORMColumn(type=\"string\", length=255)\n    *\/\n   private $name;\n\n   \/**\n    * @ORMColumn(type=\"string\", length=255)\n    *\/\n   private $department;\n\n   \/**\n    * @ORMColumn(type=\"datetime\")\n    *\/\n   private $hireDate;\n\n   \/\/ Getters and Setters\n}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#25191;&#34892;&#26597;&#35810;<\/strong>&#65306;\n&#20351;&#29992;&#19978;&#36848;&#26041;&#27861;&#21644;&#31034;&#20363;&#20195;&#30721;&#26469;&#25191;&#34892;&#20998;&#32452;&#26597;&#35810;&#12290;<\/p>\n<\/li>\n<\/ol>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#20320;&#21487;&#20197;&#29087;&#32451;&#22320;&#20351;&#29992; Doctrine &#30340; GROUP BY &#21151;&#33021;&#26469;&#22788;&#29702;&#21508;&#31181;&#25968;&#25454;&#20998;&#26512;&#38656;&#27714;&#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>&#27010;&#35272;<\/h2><p>&#12298;Doctrine&#39033;&#30446;&#12299;&#26159;&#19968;&#22871;&#20027;&#35201;&#38024;&#23545;&#25552;&#20379;&#25345;&#20037;&#21270;&#26381;&#21153;&#21644;&#30456;&#20851;&#21151;&#33021;&#30340;PHP&#24211;&#38598;&#21512;&#12290;&#20854;&#20013;&#19968;&#20010;&#37325;&#35201;&#24211;&#23601;&#26159;Doctrine ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#22120;&#65289;&#65292;&#23427;&#36890;&#36807;&#38754;&#21521;&#23545;&#35937;API&#20026;&#24320;&#21457;&#20154;&#21592;&#25552;&#20379;&#20102;SQL&#30340;&#20840;&#37096;&#21147;&#37327;&#12290;&#22312;&#26412;&#25351;&#21335;&#20013;&#65292;&#25105;&#20204;&#23558;&#25506;&#35752;&#22914;&#20309;&#26377;&#25928;&#22320;&#20351;&#29992;GROUP BY&#35821;&#21477;&#26469;&#22788;&#29702;&#19982;Doctrine&#30456;&#20851;&#30340;&#22797;&#26434;&#26597;&#35810;&#65292;&#24182;&#23454;&#29616;&#23545;&#32858;&#21512;&#20989;&#25968;&#30340;&#35268;&#33539;&#21270;&#21644;&#31616;&#21270;&#12290;<\/p><p>GROUP BY &#26159; SQL &#35821;&#35328;&#20013;&#30340;&#19968;&#20010;&#24378;&#22823;&#21151;&#33021;&#65292;&#29992;&#20110;&#26681;&#25454;&#25351;&#23450;&#21015;&#30340;&#30456;&#21516;&#20540;&#23558;&#34892;&#20998;&#32452;&#20026;&#27719;&#24635;&#34892;&#65292;&#20363;&#22914;&ldquo;&#25214;&#20986;&#27599;&#20010;&#22269;&#23478;&#30340;&#23458;&#25143;&#25968;&#37327;&#12290;&rdquo;&#24403;&#19982;&#32858;&#21512;&#20989;&#25968;&#65288;&#22914; COUNT&#12289;MAX&#12289;MIN&#12289;SUM &#21644; AVG&#65289;&#32467;&#21512;&#20351;&#29992;&#26102;&#65292;&#23427;&#20801;&#35768;&#25105;&#20204;&#23545;&#25968;&#25454;&#38598;&#25191;&#34892;&#21508;&#31181;&#22797;&#26434;&#25805;&#20316;&#12290;&#22312;&#26412;&#23454;&#29992;&#25351;&#21335;&#20013;&#65292;&#24744;&#23558;&#23398;&#20064;&#22914;&#20309;&#25104;&#21151;&#22320;&#22312; Doctrine &#20013;&#20351;&#29992; GROUP BY &#23376;&#21477;&#12290;&#20026;&#20102;&#20351;&#20854;&#26356;&#26131;&#20110;&#29702;&#35299;&#65292;&#25105;&#20204;&#23558;&#20551;&#35774;&#24744;&#24050;&#32463;&#29087;&#24713; Doctrine &#30340;&#22522;&#30784;&#30693;&#35782;&#24182;&#24050;&#23558;&#20854;&#19982;&#24744;&#30340; PHP &#24212;&#29992;&#31243;&#24207;&#38598;&#25104;&#22312;&#19968;&#36215;&#12290;<\/p><h2>&#29702;&#35299;&#23454;&#20307;&#21644;&#20179;&#24211;<\/h2><p>&#22312;&#28145;&#20837;GROUP BY&#29305;&#24615;&#30340;&#20043;&#21069;&#65292;&#29702;&#35299;&#23454;&#20307;&#21644;&#20179;&#24211;&#26159;&#38750;&#24120;&#37325;&#35201;&#30340;&#12290;&#19968;&#20010;&#23454;&#20307;&#20195;&#34920;&#20320;&#22312;&#24212;&#29992;&#31243;&#24207;&#20013;&#30340;&#19994;&#21153;&#23545;&#35937;&#65292;&#36890;&#24120;&#26144;&#23556;&#21040;&#25968;&#25454;&#24211;&#34920;&#12290;&#23427;&#23384;&#20648;Doctrine&#21487;&#20197;&#36319;&#36394;&#30340;&#25968;&#25454;&#65292;&#24182;&#20801;&#35768;&#24744;&#25191;&#34892;CRUD&#65288;&#21019;&#24314;&#12289;&#35835;&#21462;&#12289;&#26356;&#26032;&#12289;&#21024;&#38500;&#65289;&#25805;&#20316;&#12290;&#19968;&#20010;&#20179;&#24211;&#23601;&#20687;&#19968;&#32452;&#24110;&#21161;&#26041;&#27861;&#26469;&#33719;&#21462;&#29305;&#23450;&#31867;&#30340;&#23454;&#20307;&#12290;<\/p><h2>&#35774;&#32622;&#20998;&#32452;&#65288;GROUP BY&#65289;&#25805;&#20316;&#12290;<\/h2><p>&#20026;&#20102;&#28436;&#31034;GROUP BY&#30340;&#20351;&#29992;&#65292;&#35753;&#25105;&#20204;&#20197;&#19968;&#20010;&#21517;&#20026;&#8217;Customer&#8217;&#30340;&#23454;&#20307;&#20026;&#20363;&#65292;&#35813;&#23454;&#20307;&#21253;&#21547;id&#12289;name&#21644;country&#31561;&#23383;&#27573;&#12290;&#25105;&#20204;&#24076;&#26395;&#20102;&#35299;&#27599;&#20010;&#22269;&#23478;&#20013;&#30340;&#23458;&#25143;&#25968;&#37327;&#12290;&#22312;Customer&#23454;&#20307;&#30340;Doctrine&#20179;&#24211;&#20013;&#65292;&#25105;&#20204;&#23558;&#32534;&#20889;&#19968;&#20010;&#26597;&#35810;&#65306;<\/p><pre><code>$repository = $this-&gt;getDoctrine() \n    -&gt;getRepository(Customer::class);\n$queryBuilder = $repository-&gt;createQueryBuilder('c')\n    -&gt;select('c.country', 'COUNT(c.id) as customerCount')\n    -&gt;groupBy('c.country');\n$query = $queryBuilder-&gt;getQuery();\n$result = $query-&gt;getResult();\n<\/code><\/pre><p>&#36825;&#20010;&#20195;&#30721;&#26377;&#25928;&#22320;&#25353;&#22269;&#23478;&#23545;&#23458;&#25143;&#36827;&#34892;&#20998;&#32452;&#65292;&#24182;&#32479;&#35745;&#27599;&#20010;&#32452;&#30340;&#23458;&#25143;&#25968;&#37327;&#12290;<\/p><h2>&#19982;&#32858;&#21512;&#20989;&#25968;&#24037;&#20316;<\/h2><p>&#29616;&#22312;&#35753;&#25105;&#20204;&#28145;&#20837;&#25506;&#35752;&#20351;&#29992;&#32858;&#21512;&#20989;&#25968;&#19982;GROUP BY&#30340;&#20851;&#31995;&#12290;&#20363;&#22914;&#65292;&#22914;&#26524;&#24819;&#35201;&#25214;&#20986;&#27599;&#20010;&#22269;&#23478;&#30340;&#39038;&#23458;&#33457;&#36153;&#30340;&#26368;&#22823;&#37329;&#39069;&#65292;&#26597;&#35810;&#21487;&#33021;&#20250;&#22914;&#19979;&#25152;&#31034;&#65306;<\/p><pre><code>$queryBuilder = $repository-&gt;createQueryBuilder('c')\n    -&gt;select('c.country', 'MAX(c.amountSpent) as maxSpent')\n    -&gt;groupBy('c.country');\n$query = $queryBuilder-&gt;getQuery();\n$result = $query-&gt;getResult();\n<\/code><\/pre><p>&#35831;&#27880;&#24847;&#65292;&#20351;&#29992;GROUP BY&#26102;&#65292;&#35831;&#21153;&#24517;&#27880;&#24847;&#36873;&#25321;&#20165;&#21253;&#21547;&#32452;&#20869;&#33258;&#21464;&#37327;&#30340;&#25968;&#25454;&#65292;&#25110;&#22312;&#32858;&#21512;&#20989;&#25968;&#20013;&#20351;&#29992;&#30340;&#25968;&#25454;&#12290;<\/p><h2>&#22788;&#29702;&#20154;&#38469;&#20851;&#31995;<\/h2><p>&#23454;&#20307;&#36890;&#24120;&#20855;&#26377;&#20851;&#31995;&#65292;&#22914;OneToMany&#12289;ManyToOne&#31561;&#12290;&#20026;&#20102;&#26681;&#25454;&#30456;&#20851;&#23454;&#20307;&#30340;&#19968;&#20010;&#23646;&#24615;&#36827;&#34892;&#20998;&#32452;&#65292;&#20320;&#38656;&#35201;&#20808;&#36830;&#25509;&#36825;&#20123;&#23454;&#20307;&#65306;<\/p><pre><code>$queryBuilder = $repository-&gt;createQueryBuilder('c')\n    -&gt;leftJoin('c.orders', 'o')\n    -&gt;groupBy('c.country')\n    -&gt;select('c.country', 'COUNT(o.id) as ordersCount');\n$query = $queryBuilder-&gt;getQuery();\n$result = $query-&gt;getResult();\n<\/code><\/pre><p>&#35813;&#26597;&#35810;&#23558;&#36820;&#22238;&#25353;&#22269;&#23478;&#20998;&#32452;&#30340;&#23458;&#25143;&#35746;&#21333;&#25968;&#37327;&#12290;<\/p><h2>&#26368;&#20339;&#23454;&#36341;&#21644;&#38519;&#38449;<\/h2><p>&#35753;&#25105;&#20204;&#35752;&#35770;&#19968;&#20123;&#26368;&#20339;&#23454;&#36341;&#21644;&#24120;&#35265;&#38519;&#38449;&#12290;&#22914;&#26524;&#24615;&#33021;&#25104;&#20026;&#38382;&#39064;&#65292;&#30830;&#20445;&#22312;GROUP BY&#23376;&#21477;&#20013;&#30340;&#23383;&#27573;&#24050;&#36827;&#34892;&#32034;&#24341;&#12290;&#27492;&#22806;&#65292;&#22312;&#19981;&#21253;&#21547;&#22312;GROUP BY&#23376;&#21477;&#20013;&#30340;&#38750;&#32858;&#21512;&#23383;&#27573;&#36873;&#25321;&#21487;&#33021;&#20250;&#23548;&#33268;&#19981;&#26399;&#26395;&#30340;&#32467;&#26524;&#25110;&#29978;&#33267;SQL&#38169;&#35823;&#12290;&#22312;Doctrine&#20013;&#65292;&#24635;&#26159;&#25512;&#33616;&#20351;&#29992;queryBuilder&#25509;&#21475;&#26469;&#26500;&#24314;&#26597;&#35810;&#65292;&#22240;&#20026;&#23427;&#25552;&#20379;&#20102;&#21487;&#25193;&#23637;&#24615;&#21644;&#28789;&#27963;&#30340;&#32534;&#31243;&#26041;&#24335;&#26469;&#22788;&#29702;SQL&#35821;&#21477;&#12290;<\/p><h2>&#32467;&#35770;&#21644;&#35843;&#35797;&#25216;&#24039;<\/h2><p>&#25484;&#25569;Doctrine ORM&#20013;&#30340;GROUP BY&#35821;&#21477;&#21487;&#20197;&#32534;&#20889;&#39640;&#25928;&#19988;&#21487;&#35835;&#30340;&#20195;&#30721;&#12290;&#35831;&#26816;&#26597;&#24744;&#30340;Doctrine&#29256;&#26412;&#65292;&#20197;&#33719;&#21462;&#26356;&#26032;&#30340;&#21151;&#33021;&#21644;&#20860;&#23481;&#24615;&#20449;&#24687;&#12290;&#23545;&#20110;&#22797;&#26434;&#30340;&#26597;&#35810;&#38382;&#39064;&#65292;&#35831;&#21551;&#29992;SQL&#26085;&#24535;&#65292;&#20197;&#20415;&#26597;&#30475;Doctrine&#22312;&#24149;&#21518;&#20570;&#20102;&#20160;&#20040;&#65292;&#24182;&#22312;SQL&#29615;&#22659;&#20013;&#27979;&#35797;&#24744;&#30340;&#26597;&#35810;&#12290;&#36890;&#36807;&#36981;&#24490;&#36825;&#20010;&#23454;&#29992;&#25351;&#21335;&#65292;&#24744;&#23558;&#26356;&#22909;&#22320;&#20934;&#22791;&#21046;&#23450;&#21644;&#20248;&#21270;Doctrine&#20013;&#30340;GROUP BY&#26597;&#35810;&#65292;&#20174;&#32780;&#33719;&#24471;&#25972;&#27905;&#19988;&#26131;&#20110;&#32500;&#25252;&#30340;&#25968;&#25454;&#26816;&#32034;&#20195;&#30721;&#12290;<\/p><p>&#35831;&#31245;&#31561;&#65292;&#25105;&#26469;&#20026;&#24744;&#32763;&#35793;&#36825;&#27573;&#35805;&#12290;\n&#35760;&#20303;&#65292;DQL&#21644;queryBuilder&#22312;&#26576;&#20123;&#24773;&#20917;&#19979;&#21487;&#33021;&#19982;&#32431;SQL&#30340;&#34892;&#20026;&#19981;&#21516;&#65292;&#22240;&#27492;&#22914;&#26524;&#36935;&#21040;&#24847;&#22806;&#34892;&#20026;&#65292;&#35831;&#22987;&#32456;&#21442;&#32771;Doctrine&#25991;&#26723;&#12290;&#36890;&#36807;&#25345;&#20037;&#24615;&#21644;&#23454;&#36341;&#65292;Doctrine&#20013;&#30340;GROUP BY&#23558;&#22312;&#24744;&#30340;PHP&#25968;&#25454;&#31649;&#29702;&#24037;&#20855;&#31665;&#20013;&#25104;&#20026;&#19968;&#39033;&#37325;&#35201;&#24037;&#20855;&#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;PHP&#30340;ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65289;&#26694;&#26550;Doctrine&#20013;&#65292;GROUP BY&#26159;&#29992;&#20110;&#20998;&#32452;&#25968;&#25454;&#30340;&#19968;&#20010;&#20851;&#38190;&#21151;&#33021;&#12290;&#23427;&#21487;&#20197;&#24110;&#21161;&#25105;&#20204;&#26681;&#25454;&#29305;&#23450;&#26465;&#20214;&#23545;&#25968;&#25454;&#36827;&#34892;&#25490;&#24207;&#21644;&#31579;&#36873;&#12290;&#20197;&#19979;&#26159;&#19968;&#20123;&#20851;&#20110;&#22914;&#20309;&#20351;&#29992;Doctrine GROUP BY&#30340;&#23454;&#29992;&#25351;&#21335;&#65306;<\/p>\n<h3>1. &#23433;&#35013;&#24182;&#37197;&#32622; Doctrine<\/h3>\n<p>&#39318;&#20808;&#30830;&#20445;&#20320;&#30340;&#39033;&#30446;&#24050;&#32463;&#23433;&#35013;&#20102;Doctrine ORM&#12290;&#21487;&#20197;&#36890;&#36807;Composer&#26469;&#23433;&#35013;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require doctrine\/orm<\/code><\/pre>\n<p>&#28982;&#21518;&#36890;&#36807;<code>doctrine\/dbal<\/code>&#24211;&#21019;&#24314;&#25968;&#25454;&#24211;&#36830;&#25509;&#65292;&#24182;&#35774;&#32622;SQL&#27169;&#24335;&#12290;<\/p>\n<pre><code class=\"language-php\">$dm = new DoctrineDBALManager();\n$dbh = $dm-&gt;connect('sqlite:\/\/\/:memory:', array(\n    'driver' =&gt; 'pdo_sqlite',\n));<\/code><\/pre>\n<h3>2. &#21019;&#24314;&#23454;&#20307;&#31867;<\/h3>\n<p>&#22312;&#24744;&#30340;&#23454;&#20307;&#31867;&#20013;&#23450;&#20041;&#24744;&#35201;&#25805;&#20316;&#30340;&#25968;&#25454;&#12290;&#20363;&#22914;&#65292;&#20551;&#35774;&#25105;&#20204;&#35201;&#22788;&#29702;&#29992;&#25143;&#25968;&#25454;&#65292;&#21487;&#20197;&#21019;&#24314;&#19968;&#20010;&#21517;&#20026;<code>User<\/code>&#30340;&#23454;&#20307;&#31867;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppEntity;\n\nuse DoctrineORMMapping as ORM;\nuse SymfonyComponentValidatorConstraints as Assert;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryUserRepository\")\n *\/\nclass User\n{\n    \/**\n     * @ORMId()\n     * @ORMGeneratedValue()\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=255)\n     * @AssertNotBlank(message=\"Username cannot be blank.\")\n     *\/\n    private $username;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=255)\n     * @AssertNotBlank(message=\"Email cannot be blank.\")\n     *\/\n    private $email;\n\n    \/\/ getters and setters\n}<\/code><\/pre>\n<h3>3. &#21019;&#24314;&#26597;&#35810;<\/h3>\n<p>&#20351;&#29992;<code>EntityManager<\/code>&#26469;&#25191;&#34892;SQL&#35821;&#21477;&#65292;&#33719;&#21462;&#29992;&#25143;&#20449;&#24687;&#12290;&#36825;&#37324;&#25105;&#20204;&#23558;&#25353;&#29992;&#25143;&#21517;&#21644;&#30005;&#23376;&#37038;&#20214;&#23545;&#29992;&#25143;&#36827;&#34892;&#20998;&#32452;&#12290;<\/p>\n<pre><code class=\"language-php\">$userRepository = $entityManager-&gt;getRepository(User::class);\n\n\/\/ Query to get all users grouped by username and email\n$query = $userRepository-&gt;createQueryBuilder('u')\n        -&gt;select('u.username, u.email')\n        -&gt;groupBy(['u.username', 'u.email'])\n        -&gt;getQuery();\n\n\/\/ Execute the query and retrieve the results\n$users = $query-&gt;getResult();<\/code><\/pre>\n<h3>4. &#20351;&#29992; GROUP BY &#36827;&#34892;&#20998;&#32452;&#21518;&#30340;&#26597;&#35810;<\/h3>\n<p>&#23545;&#20110;&#27599;&#20010;&#20998;&#32452;&#32467;&#26524;&#65292;&#24744;&#21487;&#20197;&#32487;&#32493;&#20351;&#29992;ORM&#25552;&#20379;&#30340;&#26041;&#27861;&#26469;&#36827;&#34892;&#26356;&#22797;&#26434;&#30340;&#26597;&#35810;&#65292;&#27604;&#22914;&#35745;&#31639;&#24179;&#22343;&#24180;&#40836;&#25110;&#32773;&#26597;&#25214;&#29305;&#23450;&#29992;&#25143;&#30340;ID&#31561;&#12290;<\/p>\n<pre><code class=\"language-php\">foreach ($users as $group) {\n    echo \"Group: \" . $group['username'] . \", Email: \" . $group['email'];\n    echo \"nAverage age: \" . calculateAverageAge($group['email']);\n}\n\nfunction calculateAverageAge($emails)\n{\n    if (empty($emails)) {\n        return null;\n    }\n    $averageAge = array_sum(array_map(function ($email) {\n        \/\/ Assuming $email is a string containing an email address\n        \/\/ We can extract the part before '@' using substr() or explode() function.\n        preg_match('\/[w.-]+@[^s]+.[^s.]+\/', $email);\n    }, $emails));\n\n    return $averageAge \/ count($emails);\n}<\/code><\/pre>\n<h3>&#24635;&#32467;<\/h3>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#20320;&#21487;&#20197;&#21033;&#29992;Doctrine ORM&#30340;&#24378;&#22823;&#21151;&#33021;&#23454;&#29616;&#22797;&#26434;&#30340;&#25968;&#25454;&#31649;&#29702;&#38656;&#27714;&#12290;GROUP BY&#26159;&#19968;&#31181;&#38750;&#24120;&#26377;&#29992;&#30340;&#21151;&#33021;&#65292;&#23427;&#21487;&#20197;&#35753;&#20320;&#36731;&#26494;&#22320;&#25353;&#29031;&#25351;&#23450;&#26465;&#20214;&#23545;&#25968;&#25454;&#36827;&#34892;&#20998;&#32452;&#21644;&#32858;&#21512;&#12290;&#24076;&#26395;&#36825;&#20123;&#25351;&#21335;&#33021;&#24110;&#21161;&#20320;&#22312;&#23454;&#38469;&#24212;&#29992;&#20013;&#26356;&#22909;&#22320;&#20351;&#29992;Doctrine ORM&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#12298; Doctrine GROUP BY&#65306;&#23454;&#29992;&#25351;&#21335;&#12299; &#22312;&#25968;&#25454;&#24211;&#24320;&#21457;&#20013;&#038;..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1136","my1js","type-my1js","status-publish","hentry","my1js2nav-symfony"],"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\/1136","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=1136"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1136"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1136"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}