{"id":1123,"date":"2025-06-12T13:32:51","date_gmt":"2025-06-12T05:32:51","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1123.html"},"modified":"2025-06-12T13:32:51","modified_gmt":"2025-06-12T05:32:51","slug":"%e3%80%8adoctrine-%e4%b8%ad%e7%9a%84%e8%87%aa%e5%bc%95%e7%94%a8%e5%85%b3%e7%b3%bb%ef%bc%9a%e5%ae%9e%e8%b7%b5%e6%8c%87%e5%8d%97%ef%bc%88%e5%90%ab%e7%a4%ba%e4%be%8b%ef%bc%89%e3%80%8b","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1123.html","title":{"rendered":"\u300aDoctrine \u4e2d\u7684\u81ea\u5f15\u7528\u5173\u7cfb\uff1a\u5b9e\u8df5\u6307\u5357\uff08\u542b\u793a\u4f8b\uff09\u300b"},"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 &#20013;&#30340;&#33258;&#24341;&#29992;&#20851;&#31995;&#65306;&#23454;&#36341;&#25351;&#21335;&#65288;&#21547;&#31034;&#20363;&#65289;&#12299;<\/p>\n<p>&#22312;&#25968;&#25454;&#24211;&#35774;&#35745;&#20013;&#65292;&#33258;&#24341;&#29992;&#20851;&#31995;&#26159;&#25351;&#34920;&#20013;&#30340;&#26576;&#19968;&#21015;&#25351;&#21521;&#35813;&#34920;&#26412;&#36523;&#12290;&#36825;&#31181;&#20851;&#31995;&#22312;&#35768;&#22810;&#24212;&#29992;&#20013;&#37117;&#38750;&#24120;&#24120;&#35265;&#65292;&#20363;&#22914;&#35780;&#35770;&#31995;&#32479;&#12289;&#35770;&#22363;&#22238;&#22797;&#31561;&#12290;&#22312; Doctrine &#26694;&#26550;&#20013;&#23454;&#29616;&#33258;&#24341;&#29992;&#20851;&#31995;&#21487;&#20197;&#36890;&#36807;&#22810;&#31181;&#26041;&#24335;&#26469;&#23436;&#25104;&#65292;&#26412;&#25991;&#23558;&#35814;&#32454;&#20171;&#32461;&#22914;&#20309;&#20351;&#29992; Doctrine &#36827;&#34892;&#33258;&#24341;&#29992;&#20851;&#31995;&#30340;&#23450;&#20041;&#21644;&#25805;&#20316;&#12290;<\/p>\n<h3>1. &#23450;&#20041;&#23454;&#20307;&#31867;<\/h3>\n<p>&#39318;&#20808;&#65292;&#25105;&#20204;&#38656;&#35201;&#23450;&#20041;&#19968;&#20010;&#23454;&#20307;&#31867;&#26469;&#34920;&#31034;&#33258;&#24341;&#29992;&#20851;&#31995;&#12290;&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026; <code>Comment<\/code> &#30340;&#23454;&#20307;&#31867;&#65292;&#23427;&#21253;&#21547;&#20197;&#19979;&#23646;&#24615;&#65306;<\/p>\n<ul>\n<li><code>id<\/code>: &#20027;&#38190;&#65292;&#33258;&#21160;&#36882;&#22686;&#12290;<\/li>\n<li><code>content<\/code>: &#25991;&#26412;&#20869;&#23481;&#12290;<\/li>\n<li><code>parent_id<\/code>: &#29238;&#35780;&#35770;&#30340; ID&#65292;&#22914;&#26524;&#24403;&#21069;&#35780;&#35770;&#26159;&#39030;&#32423;&#35780;&#35770;&#65292;&#21017;&#20026; NULL&#12290;<\/li>\n<\/ul>\n<pre><code class=\"language-php\">namespace AppEntity;\n\nuse DoctrineORMMapping as ORM;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryCommentRepository\")\n *\/\nclass Comment\n{\n    \/**\n     * @ORMId\n     * @ORMGeneratedValue(strategy=\"AUTO\")\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMColumn(type=\"text\")\n     *\/\n    private $content;\n\n    \/**\n     * @ORMManyToOne(targetEntity=\"Comment\", inversedBy=\"children\")\n     * @ORMJoinColumn(name=\"parent_id\", referencedColumnName=\"id\", nullable=true)\n     *\/\n    private $parentId;\n\n    \/**\n     * @ORMOneToMany(targetEntity=\"Comment\", mappedBy=\"parentId\")\n     *\/\n    private $children;\n\n    \/\/ Getters and setters\n}<\/code><\/pre>\n<h3>2. &#21019;&#24314;&#20851;&#32852;<\/h3>\n<p>&#20026;&#20102;&#24314;&#31435;&#33258;&#24341;&#29992;&#20851;&#31995;&#65292;&#25105;&#20204;&#38656;&#35201;&#22312;&#23454;&#20307;&#31867;&#20013;&#28155;&#21152;&#36866;&#24403;&#30340;&#20851;&#32852;&#20851;&#31995;&#12290;<code>@ManyToOne<\/code> &#21644; <code>@OneToMany<\/code> &#20851;&#32852;&#20851;&#31995;&#20998;&#21035;&#29992;&#20110;&#34920;&#31034;&#29238;&#35780;&#35770;&#21644;&#23376;&#35780;&#35770;&#30340;&#20851;&#31995;&#12290;<\/p>\n<h3>3. &#37197;&#32622;&#20851;&#31995;<\/h3>\n<p>&#22312;&#37197;&#32622;&#20851;&#31995;&#26102;&#65292;&#25105;&#20204;&#21487;&#20197;&#25351;&#23450;&#20851;&#32852;&#30340;&#26041;&#21521;&#21644;&#32422;&#26463;&#26465;&#20214;&#12290;&#20363;&#22914;&#65292;&#25105;&#20204;&#24076;&#26395;&#27599;&#20010;&#35780;&#35770;&#26368;&#22810;&#21482;&#26377;&#19968;&#20010;&#29238;&#35780;&#35770;&#65292;&#24182;&#19988;&#27599;&#20010;&#35780;&#35770;&#21487;&#20197;&#26377;&#22810;&#20010;&#23376;&#35780;&#35770;&#12290;<\/p>\n<pre><code class=\"language-php\">\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryCommentRepository\")\n *\/\nclass Comment\n{\n    \/\/ ...\n\n    \/**\n     * @ORMManyToOne(targetEntity=\"Comment\", inversedBy=\"children\")\n     * @ORMJoinColumn(name=\"parent_id\", referencedColumnName=\"id\", nullable=true, onDelete=\"SET NULL\")\n     *\/\n    private $parentId;\n\n    \/**\n     * @ORMOneToMany(targetEntity=\"Comment\", mappedBy=\"parentId\")\n     *\/\n    private $children;\n\n    \/\/ ...\n}<\/code><\/pre>\n<h3>4. &#20351;&#29992;&#33258;&#24341;&#29992;&#20851;&#31995;<\/h3>\n<p>&#29616;&#22312;&#65292;&#25105;&#20204;&#21487;&#20197;&#24320;&#22987;&#20351;&#29992;&#36825;&#20010;&#33258;&#24341;&#29992;&#20851;&#31995;&#36827;&#34892;&#25968;&#25454;&#25805;&#20316;&#20102;&#12290;&#20363;&#22914;&#65292;&#25554;&#20837;&#19968;&#20010;&#39030;&#32423;&#35780;&#35770;&#24182;&#21019;&#24314;&#20854;&#23376;&#35780;&#35770;&#12290;<\/p>\n<pre><code class=\"language-php\">use AppEntityComment;\nuse AppEntityRepositoryCommentRepository;\n\n$entityManager = $this-&gt;getDoctrine()-&gt;getManager();\n\n\/\/ &#21019;&#24314;&#39030;&#32423;&#35780;&#35770;\n$topLevelComment = new Comment();\n$topLevelComment-&gt;setContent('&#36825;&#26159;&#39030;&#32423;&#35780;&#35770;');\n\n\/\/ &#20445;&#23384;&#39030;&#32423;&#35780;&#35770;&#21040;&#25968;&#25454;&#24211;\n$entityManager-&gt;persist($topLevelComment);\n$entityManager-&gt;flush();\n\n\/\/ &#21019;&#24314;&#23376;&#35780;&#35770;\n$subComment1 = new Comment();\n$subComment1-&gt;setContent('&#36825;&#26159;&#31532;&#19968;&#20010;&#23376;&#35780;&#35770;');\n$subComment1-&gt;setParentId($topLevelComment-&gt;getId());\n\n$subComment2 = new Comment();\n$subComment2-&gt;setContent('&#36825;&#26159;&#31532;&#20108;&#20010;&#23376;&#35780;&#35770;');\n$subComment2-&gt;setParentId($topLevelComment-&gt;getId());\n\n\/\/ &#20445;&#23384;&#23376;&#35780;&#35770;&#21040;&#25968;&#25454;&#24211;\n$entityManager-&gt;persist($subComment1);\n$entityManager-&gt;persist($subComment2);\n$entityManager-&gt;flush();<\/code><\/pre>\n<h3>&#24635;&#32467;<\/h3>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#25105;&#20204;&#21487;&#20197;&#25104;&#21151;&#22320;&#22312; Doctrine &#20013;&#23450;&#20041;&#21644;&#25805;&#20316;&#33258;&#24341;&#29992;&#20851;&#31995;&#12290;&#36825;&#31181;&#26041;&#27861;&#19981;&#20165;&#36866;&#29992;&#20110;&#31616;&#21333;&#30340;&#33258;&#24341;&#29992;&#20851;&#31995;&#65292;&#36824;&#36866;&#29992;&#20110;&#26356;&#22797;&#26434;&#30340;&#23884;&#22871;&#32467;&#26500;&#12290;&#24076;&#26395;&#36825;&#31687;&#25991;&#31456;&#33021;&#24110;&#21161;&#20320;&#26356;&#22909;&#22320;&#29702;&#35299;&#21644;&#20351;&#29992; Doctrine &#20013;&#30340;&#33258;&#24341;&#29992;&#20851;&#31995;&#21151;&#33021;&#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>&#24320;&#22987;&#20351;&#29992;<\/h2><p>&#22312;&#20351;&#29992;Symfony&#21644;Doctrine&#24320;&#21457;&#24212;&#29992;&#31243;&#24207;&#26102;&#65292;&#22788;&#29702;&#21508;&#31181;&#25968;&#25454;&#24211;&#20851;&#31995;&#25104;&#20026;&#20102;&#19968;&#20010;&#26631;&#20934;&#30340;&#20219;&#21153;&#12290;&#20854;&#20013;&#33258;&#20851;&#32852;&#20851;&#31995;&#38750;&#24120;&#24120;&#35265;&#20294;&#23545;&#26032;&#25509;&#35302;&#23545;&#35937;-&#20851;&#31995;&#26144;&#23556;&#65288;ORM&#65289;&#30340;&#20154;&#26469;&#35828;&#21487;&#33021;&#20250;&#24863;&#21040;&#22256;&#24785;&#12290;&#22312;&#36825;&#31687;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#23558;&#28145;&#20837;&#25506;&#35752;&#33258;&#20851;&#32852;&#20851;&#31995;&#24182;&#30475;&#21040;&#22914;&#20309;&#22312;Doctrine&#20013;&#23454;&#29616;&#23427;&#20204;&#12290;<\/p><p>&#22312;&#25105;&#20204;&#30340;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#23558;&#32771;&#34385;&#19968;&#20010;&#31038;&#20132;&#32593;&#32476;&#30340;&#31616;&#21333;&#22330;&#26223;&#65292;&#20854;&#20013;&#29992;&#25143;&#21487;&#20197;&#20851;&#27880;&#20854;&#20182;&#29992;&#25143;&#12290;&#36825;&#23548;&#33268;&#20102;&#23454;&#20307;User&#24341;&#29992;&#33258;&#36523;&#30340;&#24773;&#20917;&#12290;<\/p><h3>&#29702;&#35299;&#33258;&#24341;&#29992;&#20851;&#31995;<\/h3><p>&#22312;&#33258;&#21442;&#29031;&#20851;&#31995;&#20013;&#65292;&#34920;&#26377;&#19968;&#20010;&#22806;&#38190;&#24341;&#29992;&#20854;&#33258;&#36523;&#30340;&#20027;&#38190;&#12290;&#20174;&#38754;&#21521;&#23545;&#35937;&#30340;&#35282;&#24230;&#26469;&#30475;&#65292;&#23454;&#20307;&#21487;&#20197;&#24341;&#29992;&#33258;&#36523;&#23454;&#20363;&#12290;&#36825;&#31181;&#31867;&#22411;&#30340;&#20851;&#32852;&#21487;&#29992;&#20110;&#34920;&#31034;&#23618;&#32423;&#25968;&#25454;&#65288;&#22914;&#32452;&#32455;&#32467;&#26500;&#22270;&#65289;&#25110;&#32593;&#32476;&#22411;&#20851;&#31995;&#65288;&#22914;&#31038;&#20132;&#23186;&#20307;&#32852;&#31995;&#65289;&#12290;<\/p><h3>&#35774;&#32622;&#20013;<\/h3><p>&#22312;&#24320;&#22987;&#20043;&#21069;&#65292;&#35831;&#30830;&#20445;&#24744;&#24050;&#32463;&#35774;&#32622;&#20102;&#19968;&#20010;Symfony&#39033;&#30446;&#24182;&#20351;&#29992;&#20102;Doctrine ORM&#12290;&#25105;&#20204;&#39318;&#20808;&#20250;&#21019;&#24314;&#19968;&#20010;User&#23454;&#20307;&#12290;&#22312;&#32456;&#31471;&#20013;&#36816;&#34892;&#65306;<\/p><pre><code>php bin\/console make:entity User\n<\/code><\/pre><p>&#22909;&#30340;&#65292;&#25105;&#24050;&#32463;&#28155;&#21152;&#20102;&ldquo;username&rdquo;&#21644;&ldquo;email&rdquo;&#20004;&#20010;&#23383;&#27573;&#21040;User&#23454;&#20307;&#20013;&#12290;<\/p><h2>&#21019;&#24314;&#33258;&#24341;&#29992;&#20851;&#32852;<\/h2><p>&#20026;&#20102;&#23454;&#29616;&#33258;&#24341;&#29992;&#20851;&#32852;&#65292;&#25105;&#20204;&#23558;&#26356;&#26032;User&#23454;&#20307;&#65306;<\/p><pre><code>use DoctrineCommonCollectionsArrayCollection;\n\n\/\/ ...\nclass User {\n    \/\/ ...\n    \/**\n     * @ORMManyToMany(targetEntity=\"User\")\n     * @ORMJoinTable(name=\"followers_following\",\n     *      joinColumns={@ORMJoinColumn(name=\"following_id\", referencedColumnName=\"id\")},\n     *      inverseJoinColumns={@ORMJoinColumn(name=\"follower_id\", referencedColumnName=\"id\")}\n     * )\n     *\/\n    private $followers;\n\n    \/**\n     * @ORMManyToMany(targetEntity=\"User\", mappedBy=\"followers\")\n     *\/\n    private $following;\n\n    public function __construct() {\n        $this-&gt;followers = new ArrayCollection();\n        $this-&gt;following = new ArrayCollection();\n    }\n\n    \/\/ Getters and setters for both followers and following\n}<\/code><\/pre><p>&#19978;&#36848;&#20195;&#30721;&#21019;&#24314;&#20102;&#19968;&#20010;&#22810;&#23545;&#22810;&#33258;&#24341;&#29992;&#20851;&#32852;&#12290;&#29992;&#25143;&#21487;&#20197;&#26377;&#24456;&#22810;&#31881;&#19997;&#65292;&#20063;&#21487;&#20197;&#34987;&#24456;&#22810;&#29992;&#25143;&#20851;&#27880;&#12290;<\/p><h2>&#26356;&#26032;&#25968;&#25454;&#24211;&#27169;&#24335;<\/h2><p>&#38543;&#30528;&#25105;&#20204;&#29992;&#25143;&#23454;&#20307;&#30340;&#21464;&#21270;&#65292;&#29616;&#22312;&#26159;&#26102;&#20505;&#26356;&#26032;&#25105;&#20204;&#30340;&#25968;&#25454;&#24211;&#27169;&#24335;&#20102;&#12290;&#22312;&#32456;&#31471;&#20013;&#25191;&#34892;&#65306;<\/p><pre><code>php bin\/console doctrine:migrations:diff\nphp bin\/console doctrine:migrations:migrate\n<\/code><\/pre><p>&#36825;&#20123;&#21629;&#20196;&#29983;&#25104;&#24182;&#36816;&#34892;&#19968;&#20010;&#36801;&#31227;&#65292;&#20197;&#21019;&#24314;&#24517;&#35201;&#30340;&#34920;&#21644;&#20851;&#31995;&#26469;&#23454;&#29616;&#33258;&#24341;&#29992;&#35774;&#32622;&#12290;<\/p><h2>&#19982;&#33258;&#24341;&#29992;&#20851;&#32852;&#24037;&#20316;<\/h2><h3>&#28155;&#21152;&#20851;&#27880;&#32773;<\/h3><p>&#20026;&#20102;&#28155;&#21152;&#19968;&#20010;&#20851;&#27880;&#32773;&#21040;&#29992;&#25143;&#65292;&#38656;&#35201;&#22312;User&#23454;&#20307;&#20013;&#23454;&#29616;&#20197;&#19979;&#26041;&#27861;&#65306;<\/p><pre><code>public function addFollower(User $user): void {\n    if (!$this-&gt;followers-&gt;contains($user)) {\n        $this-&gt;followers-&gt;add($user);\n        $user-&gt;addFollowing($this);\n    }\n}<\/code><\/pre><p>&#25105;&#20204;&#36824;&#38656;&#35201;&#28155;&#21152;&#19968;&#20010; addFollowing &#26041;&#27861;&#65292;&#35813;&#26041;&#27861;&#32500;&#25252;&#21452;&#21521;&#20851;&#31995;&#65306;<\/p><pre><code>public function addFollowing(User $user): void {\n    if (!$this-&gt;following-&gt;contains($user)) {\n        $this-&gt;following-&gt;add($user);\n    }\n}<\/code><\/pre><p>&#27880;&#24847;&#65292;addFollower &#36824;&#35843;&#29992;&#20102; addFollowing&#12290;&#36825;&#30830;&#20445;&#20102;&#21452;&#26041;&#30340;&#20851;&#31995;&#37117;&#21516;&#27493;&#65292;&#36825;&#26159;&#22788;&#29702;&#21452;&#21521;&#20851;&#31995;&#30340;&#20851;&#38190;&#26041;&#38754;&#12290;<\/p><h3>&#21024;&#38500;&#20851;&#27880;&#32773;<\/h3><p>&#35201;&#21024;&#38500;&#20851;&#27880;&#32773;&#65292;&#25105;&#20204;&#21019;&#24314;&#30456;&#21453;&#30340;&#26041;&#27861;&#65306;<\/p><pre><code>public function removeFollower(User $user): void {\n    if ($this-&gt;followers-&gt;contains($user)) {\n        $this-&gt;followers-&gt;removeElement($user);\n        $user-&gt;removeFollowing($this);\n    }\n}\n\npublic function removeFollowing(User $user): void {\n    if ($this-&gt;following-&gt;contains($user)) {\n        $this-&gt;following-&gt;removeElement($user);\n    }\n}<\/code><\/pre><p>&#20877;&#27425;&#65292;&#25105;&#20204;&#30830;&#20445;&#21452;&#26041;&#20851;&#31995;&#20013;&#30340;&#21464;&#21270;&#37117;&#24471;&#21040;&#21453;&#26144;&#12290;<\/p><h2>&#27491;&#22312;&#26597;&#35810;&#20851;&#31995;&#65292;&#35831;&#31245;&#31561;&#12290;<\/h2><p>&#20026;&#20102;&#21033;&#29992;&#36825;&#31181;&#33258;&#25105;&#24341;&#29992;&#30340;&#20851;&#31995;&#65292;&#36890;&#36807;Doctrine&#30340;QueryBuilder&#25110;Repository&#20989;&#25968;&#26597;&#35810;&#38750;&#24120;&#31616;&#21333;&#12290;&#35201;&#25214;&#21040;&#26576;&#20010;&#29305;&#23450;&#29992;&#25143;&#30340;&#25152;&#26377;&#36861;&#38543;&#32773;&#65292;&#20320;&#21487;&#20197;&#36825;&#26679;&#20570;&#65306;<\/p><pre><code>$followers = $user-&gt;getFollowers();\n<\/code><\/pre><p>&#20026;&#20102;&#25214;&#21040;&#19968;&#20010;&#29992;&#25143;&#20851;&#27880;&#30340;&#20154;&#65306;<\/p><pre><code>$following = $user-&gt;getFollowing();\n<\/code><\/pre><p>&#22797;&#26434;&#30340;&#26597;&#35810;&#21487;&#20197;&#36890;&#36807;QueryBuilder&#22788;&#29702;&#65292;&#23427;&#25552;&#20379;&#20102;&#22810;&#31181;&#21487;&#33021;&#24615;&#26469;&#25490;&#24207;&#12289;&#31579;&#36873;&#21644;&#25805;&#20316;&#26816;&#32034;&#21040;&#30340;&#25968;&#25454;&#12290;<\/p><h2>&#37325;&#28201;&#25105;&#20204;&#30340;&#27036;&#26679;<\/h2><p>&#35753;&#25105;&#20204;&#20877;&#22238;&#39038;&#19968;&#19979;&#31038;&#20132;&#32593;&#32476;&#30340;&#20363;&#23376;&#12290;&#36825;&#37324;&#26159;&#22914;&#20309;&#19982;&#29992;&#25143;&#21450;&#20854;&#31881;&#19997;&#36827;&#34892;&#20132;&#20114;&#30340;&#19968;&#20010;&#31034;&#20363;&#65306;<\/p><pre><code>$entityManager = \/\/ get the entity manager\n$userA = $entityManager-&gt;find(User::class, $userIdA);\n$userB = $entityManager-&gt;find(User::class, $userIdB);\n\n\/\/ UserA follows UserB\n$userA-&gt;addFollowing($userB);\n$entityManager-&gt;flush();\n<\/code><\/pre><p>&#35201;&#21462;&#28040;&#20851;&#27880;&#65306;<\/p><pre><code>\/\/$userA unfollows $userB\n$userA-&gt;removeFollowing($userB);\n$entityManager-&gt;flush();\n<\/code><\/pre><p>&#27880;&#24847;&#65292;&#25152;&#26377;&#26356;&#25913;&#37117;&#20250;&#20351;&#29992;&#23454;&#20307;&#31649;&#29702;&#22120;&#36827;&#34892;&#25345;&#20037;&#21270;&#65292;&#20197;&#22788;&#29702;&#20851;&#31995;&#30340;&#21464;&#26356;&#12290;<\/p><h2>&#26368;&#20339;&#23454;&#36341;<\/h2><p>&#22312;&#20351;&#29992;&#33258;&#24341;&#29992;&#20851;&#31995;&#65288;&#29305;&#21035;&#26159;&#20855;&#26377;&#22810;&#23545;&#22810;&#20851;&#32852;&#24615;&#65289;&#26102;&#65292;&#38656;&#27880;&#24847;&#28508;&#22312;&#30340;&#24615;&#33021;&#38382;&#39064;&#12290;&#38543;&#30528;&#24212;&#29992;&#35268;&#27169;&#30340;&#25193;&#23637;&#65292;&#36825;&#20123;&#20851;&#31995;&#20043;&#38388;&#30340;&#32852;&#25509;&#25968;&#37327;&#21487;&#33021;&#20250;&#22686;&#21152;&#65292;&#20174;&#32780;&#21487;&#33021;&#24433;&#21709;&#21709;&#24212;&#26102;&#38388;&#12290;<\/p><p>&#32034;&#24341;&#21644;&#26377;&#35265;&#22320;&#30340;&#26597;&#35810;&#20248;&#21270;&#21464;&#24471;&#33267;&#20851;&#37325;&#35201;&#12290;&#27492;&#22806;&#65292;&#23454;&#26045;&#26576;&#31181;&#32531;&#23384;&#25110;&#35835;&#27169;&#22411;&#21487;&#33021;&#20250;&#20943;&#36731;&#39057;&#32321;&#22797;&#26434;&#26597;&#35810;&#24102;&#26469;&#30340;&#21387;&#21147;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#22312;&#26412;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#25506;&#35752;&#20102;&#22312;Doctrine&#20013;&#23454;&#29616;&#33258;&#21442;&#29031;&#20851;&#31995;&#30340;&#24494;&#22937;&#20043;&#22788;&#12290;&#25353;&#29031;&#27493;&#39588;&#36827;&#34892;&#25805;&#20316;&#21518;&#65292;&#24744;&#21487;&#20197;&#33258;&#20449;&#22320;&#22312;Symfony&#24212;&#29992;&#20013;&#31649;&#29702;&#23618;&#27425;&#32467;&#26500;&#21644;&#32593;&#32476;&#22522;&#30784;&#30340;&#25968;&#25454;&#32467;&#26500;&#12290;&#27491;&#30830;&#23454;&#26045;&#30340;&#33258;&#21442;&#29031;&#20851;&#31995;&#22312;Doctrine&#30340;ORM&#20013;&#26159;&#19968;&#31181;&#24378;&#22823;&#30340;&#24037;&#20855;&#65292;&#20026;&#26576;&#20123;&#25968;&#25454;&#34920;&#31034;&#25552;&#20379;&#20102;&#26377;&#21147;&#30340;&#35299;&#20915;&#26041;&#26696;&#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; Doctrine ORM &#20013;&#65292;&#22788;&#29702;&#33258;&#24341;&#29992;&#20851;&#31995;&#26159;&#36890;&#36807;&#23454;&#29616; <code>OneToMany<\/code> &#25110;&#32773; <code>ManyToOne<\/code> &#20851;&#31995;&#26469;&#23436;&#25104;&#30340;&#12290;&#36825;&#20123;&#20851;&#31995;&#20801;&#35768;&#20851;&#32852;&#30340;&#23545;&#35937;&#21516;&#26102;&#23384;&#22312;&#20110;&#21478;&#19968;&#20010;&#23545;&#35937;&#21644;&#23427;&#30340;&#20851;&#32852;&#23545;&#35937;&#20013;&#12290;<\/p>\n<h3>&#23454;&#36341;&#25351;&#21335;<\/h3>\n<h4>1. &#21019;&#24314;&#20851;&#32852;&#31867;<\/h4>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#20026;&#38656;&#35201;&#21019;&#24314;&#33258;&#24341;&#29992;&#20851;&#31995;&#30340;&#23545;&#35937;&#21019;&#24314;&#19968;&#20010;&#20851;&#32852;&#31867;&#12290;&#36825;&#20010;&#31867;&#24212;&#35813;&#32487;&#25215;&#33258; Doctrine &#30340; <code>Entity<\/code> &#31867;&#65292;&#24182;&#23450;&#20041;&#19982;&#25968;&#25454;&#24211;&#34920;&#30456;&#20851;&#30340;&#23646;&#24615;&#12290;<\/p>\n<pre><code class=\"language-php\">use DoctrineORMMapping as ORM;\n\n\/**\n * @ORMEntity(repositoryClass=\"MyRepository\")\n *\/\nclass MyObject\n{\n    \/**\n     * @ORMId\n     * @ORMGeneratedValue(strategy=\"AUTO\")\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMOneToOne(targetEntity=\"AnotherObject\", inversedBy=\"myObject\")\n     *\/\n    private $anotherObject;\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;<code>MyObject<\/code> &#26159;&#25105;&#20204;&#30340;&#20027;&#23545;&#35937;&#65292;&#23427;&#26377;&#19968;&#20010;&#20851;&#32852;&#30340; <code>AnotherObject<\/code> &#23545;&#35937;&#12290;&#25105;&#20204;&#20351;&#29992; <code>@ORMOneToOne<\/code> &#27880;&#35299;&#25351;&#23450;&#36825;&#20010;&#20851;&#31995;&#12290;<\/p>\n<h4>2. &#21019;&#24314;&#20851;&#32852;&#23545;&#35937;<\/h4>\n<p>&#28982;&#21518;&#65292;&#25105;&#20204;&#38656;&#35201;&#20026;&#38656;&#35201;&#34987;&#20851;&#32852;&#30340;&#23545;&#35937;&#21019;&#24314;&#19968;&#20010;&#20851;&#32852;&#23545;&#35937;&#12290;&#36825;&#20010;&#23545;&#35937;&#24212;&#35813;&#32487;&#25215;&#33258; <code>DoctrineCommonCollectionsArrayCollection<\/code> &#25110; <code>DoctrineCommonCollectionsCollection<\/code> &#31867;&#65292;&#24182;&#19988;&#35201;&#30830;&#20445;&#20854;&#20851;&#32852;&#21040; <code>MyObject<\/code>&#12290;<\/p>\n<pre><code class=\"language-php\">use DoctrineCommonCollectionsArrayCollection;\n\nclass AnotherObject extends ArrayCollection\n{\n    public function add(MyObject $anotherObject)\n    {\n        parent::add($anotherObject);\n    }\n}\n\n\/\/ &#22312;&#21478;&#19968;&#20010;&#25991;&#20214;&#20013;...\n$anotherObjects = new ArrayCollection();\n$anotherObjects-&gt;add(new AnotherObject());\n$anotherObjects-&gt;add(new AnotherObject());<\/code><\/pre>\n<p>&#36825;&#37324;&#30340;&#20851;&#38190;&#28857;&#22312;&#20110; <code>add()<\/code> &#26041;&#27861;&#65292;&#23427;&#23558; <code>AnotherObject<\/code> &#28155;&#21152;&#21040;&#38598;&#21512;&#20013;&#65292;&#36825;&#24847;&#21619;&#30528;&#24403; <code>MyObject<\/code> &#34987;&#20445;&#23384;&#26102;&#65292;&#26032;&#30340; <code>AnotherObject<\/code> &#20063;&#20250;&#34987;&#28155;&#21152;&#21040;&#38598;&#21512;&#20013;&#12290;<\/p>\n<h4>3. &#20351;&#29992;&#33258;&#24341;&#29992;&#20851;&#31995;<\/h4>\n<p>&#26368;&#21518;&#65292;&#20320;&#21487;&#20197;&#24320;&#22987;&#20351;&#29992;&#33258;&#24341;&#29992;&#20851;&#31995;&#20102;&#12290;&#24403;&#20320;&#20445;&#23384; <code>MyObject<\/code> &#26102;&#65292;<code>AnotherObject<\/code> &#23558;&#20250;&#34987;&#33258;&#21160;&#20445;&#23384;&#12290;<\/p>\n<pre><code class=\"language-php\">$entityManager = EntityManagerFactory::createEntityManager();\n\ntry {\n    \/\/ &#21019;&#24314;&#19968;&#20010;&#26032;&#30340; MyObject\n    $newMyObject = new MyObject();\n    $newMyObject-&gt;setAnotherObject($anotherObject);\n\n    \/\/ &#24320;&#22987;&#20445;&#23384;&#25805;&#20316;\n    $entityManager-&gt;persist($newMyObject);\n\n    \/\/ &#23436;&#25104;&#20445;&#23384;&#25805;&#20316;\n    $entityManager-&gt;flush();\n} finally {\n    $entityManager-&gt;close();\n}<\/code><\/pre>\n<p>&#29616;&#22312;&#65292;&#24403;&#20320;&#23581;&#35797;&#20445;&#23384; <code>MyObject<\/code> &#26102;&#65292;<code>AnotherObject<\/code> &#20063;&#23558;&#34987;&#21516;&#27493;&#20445;&#23384;&#12290;<\/p>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20197;&#19979;&#26159;&#19968;&#27573;&#20351;&#29992; Doctrine ORM &#25163;&#21160;&#20445;&#23384; <code>MyObject<\/code> &#21644; <code>AnotherObject<\/code> &#30340;&#20195;&#30721;&#65306;<\/p>\n<pre><code class=\"language-php\">use DoctrineORMEntityManagerInterface;\nuse DoctrineORMMapping as ORM;\n\n\/**\n * @ORMEntity(repositoryClass=\"MyRepository\")\n *\/\nclass MyObject\n{\n    \/**\n     * @ORMId\n     * @ORMGeneratedValue(strategy=\"AUTO\")\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMOneToOne(targetEntity=\"AnotherObject\", inversedBy=\"myObject\")\n     *\/\n    private $anotherObject;\n}\n\n\/**\n * @ORMEntity(repositoryClass=\"MyRepository\")\n *\/\nclass AnotherObject\n{\n    \/**\n     * @ORMId\n     * @ORMGeneratedValue(strategy=\"AUTO\")\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMManyToMany(targetEntity=\"MyObject\", inversedBy=\"anotherObjects\")\n     *\/\n    private $myObjects;\n\n    public function __construct()\n    {\n        $this-&gt;myObjects = new ArrayCollection();\n    }\n\n    public function add(MyObject $myObject)\n    {\n        $this-&gt;myObjects[] = $myObject;\n    }\n}\n\nuse DoctrineORMEntityManagerInterface;\nuse DoctrineORMMapping as ORM;\n\nclass MyRepository implements EntityRepositoryInterface\n{\n    public function findMyObjectsByAnotherObject(AnotherObject $anotherObject): Collection\n    {\n        return $this-&gt;getEntityManager()-&gt;getRepository(MyObject::class)-&gt;findMyObjectsByAnotherObject($anotherObject);\n    }\n\n    public function saveMyObject(MyObject $myObject): void\n    {\n        $entityManager = EntityManagerFactory::createEntityManager();\n        $entityManager-&gt;persist($myObject);\n        $entityManager-&gt;flush();\n        $entityManager-&gt;close();\n    }\n}\n\n\/\/ &#27979;&#35797;\n$entityManager = EntityManagerFactory::createEntityManager();\n$repository = new MyRepository();\n$repository-&gt;saveMyObject($myObject); \/\/ &#36825;&#37324;&#20250;&#20445;&#23384; MyObject &#21644; AnotherObject\n\n$entityManager-&gt;close(); \/\/ &#20851;&#38381; EntityManager<\/code><\/pre>\n<p>&#36825;&#27573;&#20195;&#30721;&#23637;&#31034;&#20102;&#22914;&#20309;&#25163;&#21160;&#20445;&#23384; <code>MyObject<\/code> &#21644; <code>AnotherObject<\/code>&#12290;&#27880;&#24847;&#65292;&#36825;&#31181;&#26041;&#27861;&#24182;&#19981;&#25512;&#33616;&#29992;&#20110;&#29983;&#20135;&#29615;&#22659;&#65292;&#22240;&#20026;&#23427;&#26159;&#36890;&#36807;&#35843;&#29992; <code>flush()<\/code> &#26041;&#27861;&#26469;&#36827;&#34892;&#25968;&#25454;&#25345;&#20037;&#21270;&#30340;&#65292;&#36825;&#21487;&#33021;&#20250;&#23548;&#33268;&#20869;&#23384;&#27844;&#28431;&#12290;&#22312;&#29983;&#20135;&#29615;&#22659;&#20013;&#65292;&#36890;&#24120;&#24314;&#35758;&#20351;&#29992;&#20107;&#21153;&#31649;&#29702;&#22120;&#26469;&#30830;&#20445;&#25968;&#25454;&#30340;&#19968;&#33268;&#24615;&#21644;&#23436;&#25972;&#24615;&#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 &#20013;&#30340;&#33258;&#24341;&#29992;&#20851;&#31995;&#65306;&#23454;&#36341;&#25351;&#21335;&#65288;&#21547;&#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-1123","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\/1123","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=1123"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1123"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1123"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}