{"id":1118,"date":"2025-06-12T13:25:54","date_gmt":"2025-06-12T05:25:54","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1118.html"},"modified":"2025-06-14T08:42:24","modified_gmt":"2025-06-14T00:42:24","slug":"doctrine%e4%b8%ad%e7%9a%84%e5%a4%9a%e5%af%b9%e5%a4%9a%e5%85%b3%e7%b3%bb%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\/1118.html","title":{"rendered":"Doctrine\u4e2d\u7684\u591a\u5bf9\u591a\u5173\u7cfb\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>&#26631;&#39064;&#65306; Doctrine &#20013;&#30340;&#22810;&#23545;&#22810;&#20851;&#31995;&#65306;&#23454;&#29992;&#25351;&#21335;<\/p>\n<p>&#22312;&#20351;&#29992; Doctrine &#36827;&#34892;&#25968;&#25454;&#24211;&#25805;&#20316;&#26102;&#65292;&#22810;&#23545;&#22810;&#20851;&#31995;&#65288;Many-to-Many Relationships&#65289;&#26159;&#19968;&#31181;&#24120;&#35265;&#30340;&#38656;&#27714;&#12290;&#36890;&#36807;&#37197;&#32622;&#22810;&#23545;&#22810;&#20851;&#31995;&#65292;&#21487;&#20197;&#23454;&#29616;&#22810;&#20010;&#23454;&#20307;&#20043;&#38388;&#30340;&#19968;&#23545;&#22810;&#20851;&#32852;&#12290;&#19979;&#38754;&#26159;&#19968;&#20123;&#20851;&#20110;&#22914;&#20309;&#22312; Doctrine &#20013;&#37197;&#32622;&#22810;&#23545;&#22810;&#20851;&#31995;&#30340;&#23454;&#29992;&#25351;&#21335;&#12290;<\/p>\n<h3>1. &#23450;&#20041;&#23454;&#20307;&#31867;<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#23450;&#20041;&#20004;&#20010;&#23454;&#20307;&#31867;&#65292;&#24182;&#19988;&#36825;&#20123;&#23454;&#20307;&#31867;&#20043;&#38388;&#23384;&#22312;&#22810;&#23545;&#22810;&#30340;&#20851;&#31995;&#12290;<\/p>\n<pre><code class=\"language-php\">\/\/ User.php\nnamespace AppEntity;\n\nuse DoctrineCommonCollectionsArrayCollection;\nuse DoctrineCommonCollectionsCollection;\nuse DoctrineORMMapping as ORM;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryUserRepository\")\n *\/\nclass User\n{\n    \/**\n     * @ORMId\n     * @ORMGeneratedValue(strategy=\"AUTO\")\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMOneToMany(targetEntity=\"Post\", mappedBy=\"author\")\n     *\/\n    private $posts;\n\n    public function __construct()\n    {\n        $this-&gt;posts = new ArrayCollection();\n    }\n\n    \/\/ Getters and Setters\n}\n\n\/\/ Post.php\nnamespace AppEntity;\n\nuse DoctrineCommonCollectionsArrayCollection;\nuse DoctrineCommonCollectionsCollection;\nuse DoctrineORMMapping as ORM;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryPostRepository\")\n *\/\nclass Post\n{\n    \/**\n     * @ORMId\n     * @ORMGeneratedValue(strategy=\"AUTO\")\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMManyToOne(targetEntity=\"User\", inversedBy=\"posts\")\n     * @ORMJoinColumn(name=\"author_id\")\n     *\/\n    private $author;\n\n    \/\/ Getters and Setters\n}<\/code><\/pre>\n<h3>2. &#37197;&#32622;&#20851;&#31995;<\/h3>\n<p>&#22312;&#23454;&#20307;&#31867;&#20013;&#65292;&#20351;&#29992; <code>@ORMOneToMany<\/code> &#21644; <code>@ORMManyToOne<\/code> &#27880;&#35299;&#26469;&#37197;&#32622;&#22810;&#23545;&#22810;&#20851;&#31995;&#12290;<code>mappedBy<\/code> &#23646;&#24615;&#29992;&#20110;&#25351;&#23450;&#21453;&#21521;&#20851;&#32852;&#30340;&#23646;&#24615;&#21517;&#65292;&#32780; <code>inversedBy<\/code> &#23646;&#24615;&#29992;&#20110;&#25351;&#23450;&#21453;&#21521;&#20851;&#32852;&#30340;&#23454;&#20307;&#31867;&#12290;<\/p>\n<h3>3. &#21019;&#24314;&#25968;&#25454;&#24211;&#34920;<\/h3>\n<p>&#22312;&#21019;&#24314;&#25968;&#25454;&#24211;&#34920;&#20043;&#21069;&#65292;&#38656;&#35201;&#30830;&#20445; Doctrine &#33021;&#22815;&#27491;&#30830;&#22320;&#29983;&#25104;&#34920;&#32467;&#26500;&#12290;&#20320;&#21487;&#20197;&#20351;&#29992;&#20197;&#19979;&#21629;&#20196;&#26469;&#29983;&#25104;&#34920;&#65306;<\/p>\n<pre><code class=\"language-bash\">php bin\/console doctrine:schema:update --force<\/code><\/pre>\n<h3>4. &#20351;&#29992;&#23454;&#20307;&#36827;&#34892;&#26597;&#35810;<\/h3>\n<p>&#29616;&#22312;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#23454;&#20307;&#26469;&#36827;&#34892;&#22810;&#23545;&#22810;&#20851;&#31995;&#30340;&#25805;&#20316;&#12290;&#20363;&#22914;&#65292;&#33719;&#21462;&#26576;&#20010;&#29992;&#25143;&#30340;&#25152;&#26377;&#24086;&#23376;&#65306;<\/p>\n<pre><code class=\"language-php\">$user = $entityManager-&gt;getRepository(User::class)-&gt;find(1);\n$posts = $user-&gt;getPosts();\n\nforeach ($posts as $post) {\n    echo $post-&gt;getTitle() . PHP_EOL;\n}<\/code><\/pre>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20197;&#19979;&#26159;&#19968;&#20010;&#23436;&#25972;&#30340;&#31034;&#20363;&#20195;&#30721;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312; Doctrine &#20013;&#37197;&#32622;&#22810;&#23545;&#22810;&#20851;&#31995;&#24182;&#36827;&#34892;&#26597;&#35810;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\nrequire 'vendor\/autoload.php';\n\nuse DoctrineORMEntityManager;\nuse DoctrineORMORMSetup;\nuse DoctrineORMToolsSchemaTool;\n\n\/\/ &#35774;&#32622;&#25968;&#25454;&#24211;&#36830;&#25509;&#21442;&#25968;\n$config = [\n    'driver' =&gt; 'pdo_mysql',\n    'host' =&gt; 'localhost',\n    'dbname' =&gt; 'test_db',\n    'user' =&gt; 'root',\n    'password' =&gt; '',\n];\n\n\/\/ &#21019;&#24314; EntityManager &#23454;&#20363;\n$entityManager = EntityManager::create($config, new DoctrineDBALConfiguration());\n\n\/\/ &#21019;&#24314; SchemaTool &#23454;&#20363;\n$schemaTool = new SchemaTool($entityManager);\n\n\/\/ &#33719;&#21462;&#25152;&#26377;&#23454;&#20307;&#31867;\n$entityClasses = get_declared_classes();\n$entities = array_filter($entityClasses, function ($className) use ($entityManager) {\n    return is_subclass_of($className, 'DoctrineORMEntity');\n});\n\n\/\/ &#29983;&#25104; schema\n$schemaTool-&gt;updateSchema($entities);\n\n\/\/ &#26597;&#35810;&#29992;&#25143;&#30340;&#25152;&#26377;&#24086;&#23376;\n$user = $entityManager-&gt;getRepository(User::class)-&gt;find(1);\n$posts = $user-&gt;getPosts();\n\nforeach ($posts as $post) {\n    echo $post-&gt;getTitle() . PHP_EOL;\n}\n?&gt;<\/code><\/pre>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#20320;&#21487;&#20197;&#22312; Doctrine &#20013;&#25104;&#21151;&#37197;&#32622;&#21644;&#20351;&#29992;&#22810;&#23545;&#22810;&#20851;&#31995;&#12290;&#24076;&#26395;&#36825;&#20010;&#25351;&#21335;&#23545;&#20320;&#26377;&#25152;&#24110;&#21161;&#65281;<\/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;&#22810;&#23545;&#22810;&#20851;&#31995;<\/h2><p>&#22312;&#20351;&#29992;Symfony&#21644;Doctrine ORM&#36827;&#34892;&#24320;&#21457;&#26102;&#65292;&#29702;&#35299;&#25968;&#25454;&#24211;&#20851;&#31995;&#38750;&#24120;&#37325;&#35201;&#12290;&#20854;&#20013;&#19968;&#31181;&#24120;&#35265;&#30340;&#31867;&#22411;&#26159;&#22810;&#23545;&#22810;&#65288;many-to-many&#65289;&#20851;&#31995;&#65292;&#21363;&#19968;&#20010;&#23454;&#20307;&#21487;&#20197;&#19982;&#21478;&#19968;&#20010;&#23454;&#20307;&#30340;&#22810;&#20010;&#23454;&#20363;&#20851;&#32852;&#65292;&#21453;&#20043;&#20134;&#28982;&#12290;&#20363;&#22914;&#65292;&#22312;&#29992;&#25143;&#21644;&#35282;&#33394;&#30340;&#22330;&#26223;&#20013;&#65292;&#19968;&#20010;&#29992;&#25143;&#21487;&#20197;&#25317;&#26377;&#22810;&#20010;&#35282;&#33394;&#65292;&#32780;&#19968;&#20010;&#35282;&#33394;&#20063;&#21487;&#20197;&#20998;&#37197;&#32473;&#22810;&#20010;&#29992;&#25143;&#12290;<\/p><p>&#36825;&#26412;&#23454;&#29992;&#25351;&#21335;&#23558;&#24341;&#23548;&#24744;&#36890;&#36807;&#35774;&#32622;Doctrine&#20013;&#30340;&#22810;&#23545;&#22810;&#20851;&#31995;&#30340;&#36807;&#31243;&#65292;&#20174;&#27880;&#35299;&#21040;&#26597;&#35810;&#12290;<\/p><h2>&#23454;&#20307;&#37197;&#32622;<\/h2><p>&#35753;&#25105;&#20204;&#20197;&#29992;&#25143;&#21644;&#35282;&#33394;&#20026;&#20363;&#65292;&#39318;&#20808;&#38656;&#35201;&#35782;&#21035;&#25105;&#20204;&#30340;&#23454;&#20307;&mdash;&mdash;&#29992;&#25143;&#21644;&#35282;&#33394;&#65292;&#24182;&#24314;&#31435;&#20851;&#31995;&#12290;<\/p><pre><code>\/\/ src\/Entity\/User.php\nnamespace AppEntity;\nuse DoctrineCommonCollectionsArrayCollection;\nuse DoctrineORMMapping as ORM;\n\/**\n * @ORMEntity\n *\/\nclass User {\n \/\/ ...\n \/**\n  * @ORMManyToMany(targetEntity=\"Role\", inversedBy=\"users\")\n  * @ORMJoinTable(name=\"users_roles\")\n  *\/\n private $roles;\n public function __construct() {\n     $this-&gt;roles = new ArrayCollection();\n }\n \/\/ ...\n}<\/code><\/pre><pre><code>\/\/ src\/Entity\/Role.php\nnamespace AppEntity;\nuse DoctrineCommonCollectionsArrayCollection;\nuse DoctrineORMMapping as ORM;\n\/**\n * @ORMEntity\n *\/\nclass Role {\n \/\/ ...\n \/**\n  * @ORMManyToMany(targetEntity=\"User\", mappedBy=\"roles\")\n  *\/\n private $users;\n public function __construct() {\n     $this-&gt;users = new ArrayCollection();\n }\n \/\/ ...\n}<\/code><\/pre><p>&#22312;User&#23454;&#20307;&#20013;&#65292;&#25105;&#20204;&#23450;&#20041;&#20102;&#22810;&#23545;&#22810;&#20851;&#31995;&#65292;&#24182;&#19988;&#25351;&#23450;&#20102;JoinTable&#65292;&#36825;&#23558;&#22312;&#25968;&#25454;&#24211;&#20013;&#20316;&#20026;&#36830;&#25509;&#34920;&#20351;&#29992;&#12290;&#8217;inversedBy&#8217;&#37096;&#20998;&#25351;&#30340;&#26159;Role&#23454;&#20307;&#20013;&#26144;&#23556;&#21040;User&#30340;&#23646;&#24615;&#12290;&#22312;Role&#20391;&#65292;&#8217;mappedBy&#8217;&#25351;&#30340;&#26159;User&#23454;&#20307;&#20013;&#30340;&#23646;&#24615;&#12290;<\/p><h2>&#19982;&#20851;&#31995;&#24037;&#20316;<\/h2><p>&#20026;&#20102;&#25805;&#32437;&#19968;&#23545;&#22810;&#20851;&#31995;&#65292;&#25105;&#20204;&#38656;&#35201;&#22312;&#25105;&#20204;&#30340;&#23454;&#20307;&#19978;&#28155;&#21152;&#26041;&#27861;&#65292;&#20197;&#20415;&#25105;&#20204;&#21487;&#20197;&#28155;&#21152;&#21644;&#21024;&#38500;&#23454;&#20363;&#12290;&#20197;&#19979;&#26159;&#23545;User&#23454;&#20307;&#30340;&#31034;&#20363;&#65306;<\/p><pre><code>public function addRole(Role $role) {\n if (!$this-&gt;roles-&gt;contains($role)) {\n     $this-&gt;roles[] = $role;\n     $role-&gt;addUser($this); \/\/ Synchronize the inverse side\n }\n}\npublic function removeRole(Role $role) {\n if ($this-&gt;roles-&gt;removeElement($role)) {\n     $role-&gt;removeUser($this); \/\/ Synchronize the inverse side\n }\n}<\/code><\/pre><p>&#22312;&#35282;&#33394;&#23454;&#20307;&#20013;&#65292;&#20320;&#20063;&#38656;&#35201;&#36825;&#26679;&#20570;&#12290;<\/p><pre><code>public function addUser(User $user) {\n if (!$this-&gt;users-&gt;contains($user)) {\n     $this-&gt;users[] = $user;\n     $user-&gt;addRole($this); \/\/ Synchronize the inverse side\n }\n}\npublic function removeUser(User $user) {\n if ($this-&gt;users-&gt;removeElement($user)) {\n     $user-&gt;removeRole($this); \/\/ Synchronize the inverse side\n }\n}<\/code><\/pre><h2>&#20445;&#25345;&#21644;&#26816;&#32034;&#25968;&#25454;<\/h2><p>&#22312;&#20851;&#31995;&#30340;&#21452;&#26041;&#37117;&#24050;&#35774;&#32622;&#22909;&#65292;&#20197;&#21450;&#26041;&#27861;&#26469;&#28155;&#21152;&#25110;&#31227;&#38500;&#23454;&#20307;&#20043;&#21518;&#65292;&#19979;&#19968;&#27493;&#23601;&#26159;&#22788;&#29702;&#25968;&#25454;&#20102;&#12290;&#20197;&#19979;&#26159;&#22914;&#20309;&#25345;&#20037;&#21270;&#19968;&#20010;&#26032;&#20851;&#31995;&#30340;&#26041;&#24335;&#65306;<\/p><pre><code>\/\/ Inside a Symfony controller:\n\/\/ ... assume $entityManager is your DoctrineORMEntityManager\n&nbsp;$user = \/\/ ... get or create a User entity;\n&nbsp;$role = \/\/ ... get or create a Role entity;\n&nbsp;$user-&gt;addRole($role);\n&nbsp;$entityManager-&gt;persist($user);\n&nbsp;$entityManager-&gt;persist($role);\n&nbsp;$entityManager-&gt;flush();\n<\/code><\/pre><p>&#20026;&#20102;&#26816;&#32034;&#25968;&#25454;&#65292;&#20351;&#29992;&#23454;&#20307;&#20179;&#24211;&#65306;<\/p><pre><code>\/\/ Inside a Symfony controller:\n\/\/ ... assume $userRepository is your repository for User entities\n&nbsp;$usersWithRole = $userRepository-&gt;findBy(['roles' =&gt; $role]);\n<\/code><\/pre><h2>&#26597;&#35810;&#22810;&#23545;&#22810;&#20851;&#31995;<\/h2><p>&#23545;&#20110;&#26356;&#22797;&#26434;&#30340;&#26597;&#35810;&#65292;&#35831;&#20351;&#29992;Doctrine&#30340;QueryBuilder&#65306;<\/p><pre><code>\/\/ Inside a Symfony controller:\n\/\/ ...$queryBuilder = $entityManager-&gt;createQueryBuilder();\n&nbsp;$query = $queryBuilder-&gt;select('u', 'r')\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. 'FROM AppEntityUser u'\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. 'JOIN u.roles r'\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. 'WHERE r.name = :roleName'\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. 'setParameter('roleName', 'Admin')\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. 'getQuery();\n&nbsp;$admins = $query-&gt;getResult();\n<\/code><\/pre><p>&#36825;&#20250;&#33719;&#21462;&#25152;&#26377;&#20855;&#26377;&ldquo;&#31649;&#29702;&#21592;&rdquo;&#35282;&#33394;&#30340;&#29992;&#25143;&#12290;&#35831;&#27880;&#24847;&#65292;&#25105;&#20204;&#36890;&#36807;&#29992;&#25143;&#23454;&#20307;&#19982;&ldquo;&#35282;&#33394;&rdquo;&#38598;&#21512;&#36827;&#34892;&#20851;&#32852;&#12290;<\/p><h2>&#26368;&#20339;&#23454;&#36341;&#21644;&#24615;&#33021;<\/h2><p>&#22810;&#23545;&#22810;&#20851;&#31995;&#21487;&#20197;&#24102;&#26469;&#24615;&#33021;&#21387;&#21147;&#12290;&#32531;&#23384;&#32467;&#26524;&#12289;&#20351;&#29992;fetch joins&#26469;&#36991;&#20813;N+1&#26597;&#35810;&#65292;&#20197;&#21450;&#32771;&#34385;&#22312;join&#34920;&#20013;&#30340;&#32034;&#24341;&#21015;&#21487;&#20197;&#24110;&#21161;&#32531;&#35299;&#36825;&#20123;&#38382;&#39064;&#12290;&#24403;&#22788;&#29702;&#26435;&#23041;&#20851;&#32852;&#26102;&#65292;&#22312;&#26576;&#31181;&#31243;&#24230;&#19978;&#65292;&#23558;&#20851;&#31995;&#35268;&#33539;&#21270;&#20026;OneToMany\/ManyToOne&#21487;&#33021;&#26356;&#26377;&#21033;&#65292;&#20174;&#32780;&#25552;&#20379;&#26356;&#22810;&#30340;&#25511;&#21046;&#21644;&#26356;&#23569;&#30340;&#27495;&#20041;&#24615;&#12290;<\/p><p>&#22914;&#26524;&#24744;&#30340;&#22810;&#23545;&#22810;&#20851;&#31995;&#21253;&#21547;&#39069;&#22806;&#30340;&#21015;&#65292;&#24744;&#38656;&#35201;&#21019;&#24314;&#19968;&#20010;&#23454;&#20307;&#31867;&#26469;&#34920;&#31034;&#20851;&#32852;&#34920;&#65292;&#24182;&#23558;&#20851;&#31995;&#36716;&#25442;&#20026;&#20004;&#20010;&#19968;&#23545;&#19968;&#30340;&#20851;&#31995;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#22810;&#23545;&#22810;&#20851;&#31995;&#26159;Doctrine&#30340;&#19968;&#20010;&#24378;&#22823;&#29305;&#24615;&#65292;&#27491;&#30830;&#20351;&#29992;&#26102;&#21487;&#20197;&#22823;&#22823;&#25552;&#21319;Symfony&#24212;&#29992;&#30340;&#21151;&#33021;&#24615;&#12290;&#29702;&#35299;Doctrine&#30340;&#20851;&#31995;&#31649;&#29702;&#33021;&#30830;&#20445;&#25968;&#25454;&#24211;&#20132;&#20114;&#39640;&#25928;&#65292;&#20195;&#30721;&#32467;&#26500;&#28165;&#26224;&#26131;&#25026;&#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;&#20351;&#29992; Doctrine &#30340;&#26102;&#20505;&#65292;&#22788;&#29702;&#22810;&#23545;&#22810;&#20851;&#31995;&#26159;&#38750;&#24120;&#24120;&#35265;&#30340;&#12290;&#19979;&#38754;&#25105;&#23558;&#20026;&#20320;&#25552;&#20379;&#19968;&#20123;&#20851;&#20110;&#22914;&#20309;&#21033;&#29992; Doctrine &#22788;&#29702;&#22810;&#23545;&#22810;&#20851;&#31995;&#30340;&#23454;&#29992;&#25351;&#21335;&#12290;<\/p>\n<h3>1. &#21019;&#24314;&#23454;&#20307;&#31867;<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#21019;&#24314;&#20004;&#20010;&#23454;&#20307;&#31867;&#26469;&#20195;&#34920;&#20320;&#30340;&#20851;&#32852;&#23454;&#20307;&#12290;&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&ldquo;User&rdquo;&#21644;&ldquo;Post&rdquo;&#30340;&#23454;&#20307;&#31867;&#65306;<\/p>\n<pre><code class=\"language-php\">class User {\n    private $posts;\n\n    public function __construct(User $user, array $posts) {\n        $this-&gt;user = $user;\n        $this-&gt;posts = $posts;\n    }\n\n    public function getPosts() {\n        return $this-&gt;posts;\n    }\n}\n\nclass Post {\n    private $user;\n\n    public function __construct(Post $post, User $user) {\n        $this-&gt;post = $post;\n        $this-&gt;user = $user;\n    }\n\n    public function getUser() {\n        return $this-&gt;user;\n    }\n}<\/code><\/pre>\n<h3>2. &#21019;&#24314;&#20851;&#32852;&#35268;&#21017;<\/h3>\n<p>&#25509;&#19979;&#26469;&#65292;&#25105;&#20204;&#38656;&#35201;&#23450;&#20041;&#19968;&#20010;&#20851;&#32852;&#35268;&#21017;&#26469;&#34920;&#31034;&#29992;&#25143;&#19982;&#24086;&#23376;&#20043;&#38388;&#30340;&#20851;&#31995;&#12290;&#25105;&#20204;&#23558;&#20351;&#29992; <code>OneToMany<\/code> &#20851;&#32852;&#35268;&#21017;&#26469;&#23454;&#29616;&#36825;&#20010;&#30446;&#26631;&#65306;<\/p>\n<pre><code class=\"language-php\">public function addPost(Post $post): void {\n    if (!$this-&gt;hasPost($post)) {\n        $this-&gt;posts[] = $post;\n    }\n}<\/code><\/pre>\n<p>&#36825;&#37324;&#65292;<code>$this-&gt;hasPost()<\/code> &#26041;&#27861;&#29992;&#20110;&#26816;&#26597;&#19968;&#20010;&#24086;&#23376;&#26159;&#21542;&#24050;&#32463;&#23384;&#22312;&#20110;&#29992;&#25143;&#30340;&#25152;&#26377;&#24086;&#23376;&#21015;&#34920;&#20013;&#12290;&#22914;&#26524;&#19981;&#23384;&#22312;&#65292;&#21017;&#28155;&#21152;&#35813;&#24086;&#23376;&#21040;&#29992;&#25143;&#30340;&#24086;&#23376;&#25968;&#32452;&#20013;&#12290;<\/p>\n<h3>3. &#20351;&#29992; EntityManager<\/h3>\n<p>&#26368;&#21518;&#19968;&#27493;&#26159;&#20351;&#29992; EntityManager &#26469;&#31649;&#29702;&#36825;&#20123;&#20851;&#32852;&#35268;&#21017;&#12290;&#36825;&#38656;&#35201;&#22312;&#24744;&#30340;&#24212;&#29992;&#31243;&#24207;&#20013;&#24341;&#20837; Doctrine&#65292;&#24182;&#30830;&#20445;&#24744;&#30340;&#37197;&#32622;&#25991;&#20214;&#65288;&#36890;&#24120;&#26159; <code>app\/config\/config.yml<\/code>&#65289;&#27491;&#30830;&#35774;&#32622;&#20102;&#25968;&#25454;&#24211;&#36830;&#25509;&#20449;&#24687;&#12290;<\/p>\n<pre><code class=\"language-yaml\">doctrine:\n    orm:\n        entity_managers:\n            default: ~\n            user_posts: ~<\/code><\/pre>\n<p>&#29616;&#22312;&#65292;&#24744;&#21487;&#20197;&#22312; <code>User<\/code> &#21644; <code>Post<\/code> &#23454;&#20307;&#31867;&#20013;&#20351;&#29992; EntityManager &#26469;&#25805;&#20316;&#23427;&#20204;&#30340;&#20851;&#32852;&#20851;&#31995;&#65306;<\/p>\n<pre><code class=\"language-php\">$user = new User();\n$post = new Post();\n\n\/\/ &#28155;&#21152;&#29992;&#25143;&#21040;&#24086;&#23376;&#21015;&#34920;\n$user-&gt;addPost($post);\n\n\/\/ &#33719;&#21462;&#29992;&#25143;&#30340;&#25152;&#26377;&#24086;&#23376;\nforeach ($user-&gt;getPosts() as $post) {\n    \/\/ &#22312;&#36825;&#37324;&#20320;&#21487;&#20197;&#20570;&#20219;&#20309;&#19982;&#24086;&#23376;&#30456;&#20851;&#30340;&#36923;&#36753;...\n}<\/code><\/pre>\n<p>&#36890;&#36807;&#36825;&#31181;&#26041;&#24335;&#65292;&#24744;&#21487;&#20197;&#36731;&#26494;&#22320;&#31649;&#29702;&#21644;&#26597;&#35810;&#22810;&#23545;&#22810;&#30340;&#20851;&#31995;&#12290;&#24076;&#26395;&#36825;&#23545;&#24744;&#26377;&#25152;&#24110;&#21161;&#65281;&#22914;&#26524;&#24744;&#26377;&#20219;&#20309;&#20854;&#20182;&#38382;&#39064;&#65292;&#35831;&#38543;&#26102;&#25552;&#38382;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#26631;&#39064;&#65306; Doctrine &#20013;&#30340;&#22810;&#23545;&#22810;&#20851;&#31995;&#65306;&#23454;&#29992;&#25351;&#21335; &#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-1118","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\/1118","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=1118"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1118"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1118"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}